有没有办法直接从相应的NSManagedObject
的属性检索核心数据实体的属性的键?这将消除在某些情况下依赖基于字符串('stringly-typed')代码的需要,从而降低出错的风险。
例如,我想替换以下内容:
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "createdDate", ascending: false)]
......有更像这样的东西:
fetchRequest.sortDescriptors = [NSSortDescriptor(key: exampleNSManagedObject.createdDate.key, ascending: false)]
我知道.defaultSortDescriptors
可用于实现其中一些,但仅限于固定属性。我也知道.entity.attributesByName.keys
可用于获取密钥列表,但我还没有建立一种方法来自动隔离相关密钥。
#keyPath字符串表达式是您要查找的内容吗?来自docs:
您可以使用#keyPath字符串表达式来创建可由KVC方法使用的编译器检查的密钥和密钥路径
例如:
fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(ExampleNSManagedObject.createdDate), ascending: false)]
嗯,当然你可以写一个扩展到NSManagedObject
,其中包含一个函数,该函数将采用人工编写的字符串并返回.entity.attributesByName.keys
中的最佳匹配,这将解决您已经说明的问题。
但更好的方法是使用一个工具,它将从您的数据模型中自动生成这些关键常量。查看mogenerator,它是Xcode中内置的核心数据代码生成的开源“专业”替代品。它的功能之一是为每个实体生成这样的枚举:
public enum MyEntityAttributes: String {
case createdDate = "createdDate"
case foo = "foo"
case bar = "bar"
}
然后你想要的密钥字符串可以作为MyEntityAttributes.foo
访问。