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



有没有办法直接从相应NSManagedObject的属性中检索核心数据实体属性的键?这将消除在某些情况下依赖基于字符串("字符串类型"(代码的需要,从而降低出错的风险。

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

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

。还有这样的东西:

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

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

#keyPath 字符串表达式是您要查找的吗? 从文档中:

您可以使用 #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访问所需的密钥字符串。

最新更新