2017-06-28 136 views
1

我想在運行時檢查Swift中屬性數據類型的類型。像插入時一樣,我想檢查實體中的特定屬性是否接受日期類型或字符串類型的值。 Swift如何實現這一點。如何在運行時檢查覈心數據屬性類型?

+2

選中此項。 https://stackoverflow.com/questions/24006165/how-do-i-print-the-type-or-class-of-a-variable-in-swift。 –

+0

你有沒有例子? – Siriss

+0

實際上,由於模型是隻讀的,因此您應該知道運行時的屬性及其類型。 – vadian

回答

0

這是type(of:) .E.g,

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

對於Swift來說這是真的,但對於Core Data來說,使用Core Data的反射方法會更好。 –

3

您可以隨時使用實體的屬性描述是型NSAttributeDescription,找出正確的類型是在模型中定義的屬性。

如果說你有一個子類NSManagedObject,Person。然後,你可以使用從下面的代碼示例插入之前先檢查類型,

@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

在一般情況下,你應該知道你的模型是什麼,你寫你的代碼之前。 所以對只讀模型的反思似乎有點愚蠢。我想不出爲什麼你會這樣做,但我相信你有一個很好的理由,你沒有分享。

你可以看看一個managedObject entity類方法(在你的子類上),它是一個NSEntityDescription。或者您可以直接從您的模型對象(context.persistentStoreCoordinator.managedObjectModel.entites)獲取所有實體描述,或者如果您知道該實體的名稱,則可以使用context.persistentStoreCoordinator. managedObjectModel.entitiesByName["EntityName"]。實體描述會告訴你有關實體屬性的所有信息。您可以查看每個屬性並獲取NSAttributeDescription,它會告訴您該屬性的類型。