2017-06-28 3 views
1

Ich möchte den Typ des Attributtyps zur Laufzeit in Swift überprüfen. Wie beim Einfügen möchte ich überprüfen, ob das bestimmte Attribut in einer Entität den Wert des Datumstyps oder Zeichenkettentyps akzeptiert. Wie das in Swift erreicht werden kann.Wie zur Kerndatenattributtyp zur Laufzeit überprüfen?

+2

Überprüfen Sie dies. https://stackoverflow.com/questions/24006165/how-do-i-print-the-type-or-class-of-a-variable-in-swift. –

+0

Haben Sie ein Beispiel? – Siriss

+0

Eigentlich sollten Sie die Attribute und ihre Typen zur Laufzeit wissen, da das Modell schreibgeschützt ist. – vadian

Antwort

0

Es ist type(of:) .E.g.,

let test: Int = 0 
if type(of: test) == Int.self { 
    print("found") 
} 
+1

Das gilt für Swift im Allgemeinen, aber mit Core Data ist es besser, die Reflektionsmethoden von Core Data zu verwenden. –

3

können Sie immer die Attributbeschreibung verwenden Einheit, die vom Typ ist NSAttributeDescription, um die richtige Art der Immobilie herauszufinden, die in Modell definiert ist.

Wenn Sie sagen, Sie haben eine Unterklasse von NSManagedObject, Person. Dann könnten Sie beispielsweise aus folgenden Code verwenden, um die Art zu überprüfen, bevor das Einfügen,

@objc(Person) 
class Person: NSManagedObject { 
    @NSManaged 
    var name: String 

    @NSManaged 
    var age: NSNumber 

    @NSManaged 
    var dateOfBirth: Date 
} 

let person = NSEntityDescription.insertNewObject(forEntityName: "Person", into: context) as! Person 

if let attribute = person.entity.attributesByName["name"], 
         attribute.attributeType == .stringAttributeType { 

    // use your code here for custom logic 
    print("name is string") 
} 

if let attribute = person.entity.attributesByName["age"], 
         attribute.attributeType == .dateAttributeType { 

    // use your code here for custom logic 

    print("age is date") 
} 
0

Im Allgemeinen sollten Sie wissen, was Ihr Modell ist, bevor Sie den Code schreiben. So introvertiert auf einem Readonly-Modell scheint ein wenig albern. Ich kann mir keinen Grund vorstellen, warum du das jemals tun würdest, aber ich bin sicher, du hast einen guten Grund, dass du es nicht teilst.

Sie können eine verwalteteObject entity Klassenmethode (in Ihrer Unterklasse) ansehen, die eine NSEntityDescription ist. Oder Sie können alle Entitätsbeschreibungen direkt von Ihrem Modellobjekt abrufen (context.persistentStoreCoordinator.managedObjectModel.entites) oder wenn Sie den Namen der Entität kennen, können Sie context.persistentStoreCoordinator. managedObjectModel.entitiesByName["EntityName"] verwenden. Die Entitätsbeschreibung informiert Sie über die Eigenschaften der Entitäten. Sie können jedes der Attribute durchsehen und erhalten eine NSAttributeDescription, die Ihnen den Typ für dieses Attribut mitteilt.