如何在运行时检查核心数据属性类型?

时间:2017-06-28 12:49:25

标签: ios swift core-data

我想在Swift中检查运行时的属性数据类型。就像插入时一样,我想检查实体中的特定属性是否接受日期类型或字符串类型的值。如何在Swift中实现这一目标。

3 个答案:

答案 0 :(得分:3)

您始终可以使用 NSAttributeDescription 类型的实体属性描述来查找模型中定义的属性的正确类型。

如果说你有 NSManagedObject 的子类,那么。然后,您可以使用以下代码中的示例来检查插入前的类型,

@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")
}

答案 1 :(得分:0)

这是type(of:)。例如,

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

答案 2 :(得分:0)

通常,在编写代码之前,您应该知道您的模型是什么。 所以对readonly模型的反省似乎有点傻。我想不出你为什么要这样做的任何理由,但我相信你有充分的理由不分享。

您可以查看一个entity的托管对象NSEntityDescription类方法(在您的子类上)。或者,您可以直接从模型对象(context.persistentStoreCoordinator.managedObjectModel.entites)获取所有实体描述,或者如果您知道实体的名称,则可以使用context.persistentStoreCoordinator. managedObjectModel.entitiesByName["EntityName"]。实体描述将告诉您有关实体属性的所有信息。您可以查看每个属性并获取NSAttributeDescription,它将告诉您该属性的类型。