如何从NSManagedObject属性派生核心数据属性键?

时间:2019-04-17 17:42:08

标签: ios swift core-data key nsmanagedobject

是否可以直接从相应的NSManagedObject的属性中检索核心数据实体的属性的键?在某些情况下,这将消除对基于字符串(“字符串类型”)代码的依赖,从而降低了出错的风险。

例如,我要替换以下内容:

fetchRequest.sortDescriptors = [NSSortDescriptor(key: "createdDate", ascending: false)]

...更像这样:

fetchRequest.sortDescriptors = [NSSortDescriptor(key: exampleNSManagedObject.createdDate.key, ascending: false)]

我知道.defaultSortDescriptors可用于实现其中的某些功能,但仅用于固定属性。我也知道.entity.attributesByName.keys可用于获取密钥列表,但是我还没有建立一种方法来自动隔离相关密钥。

2 个答案:

答案 0 :(得分:1)

您正在寻找#keyPath字符串表达式吗?来自docs

  

您使用#keyPath字符串表达式来创建编译器检查的键和KVC方法可以使用的键路径

例如:

fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(ExampleNSManagedObject.createdDate), ascending: false)]

答案 1 :(得分:0)

当然,您可以为NSManagedObject编写一个扩展,其中包含一个函数,该函数将采用人工编写的字符串并返回.entity.attributesByName.keys之间的最佳匹配,这将解决您遇到的问题。 ve声明了。

但是更好的方法是使用一种工具,该工具会从您的数据模型自动生成此类键常量。查看mogenerator,这是Xcode内置的Core Data代码生成的开源“专业”替代。它的功能之一是为每个实体生成这样的枚举:

public enum MyEntityAttributes: String {
    case createdDate = "createdDate"
    case foo = "foo"
    case bar = "bar"
}

,然后可以通过MyEntityAttributes.foo来访问所需的密钥字符串。