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

How to Derive a Core Data Attribute Key from an NSManagedObject Property?

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

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

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

...还有更多像这样的东西:

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

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

嗯,当然你可以写一个 NSManagedObject 的扩展,其中包含一个函数,该函数将采用人工编写的字符串和 return .entity.attributesByName.keys 中的最佳匹配,这将解决你所说的问题。

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

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

然后您想要的密钥字符串可以访问为 MyEntityAttributes.foo

#keyPath 字符串表达式是您要查找的内容吗?来自 docs:

You use the #keyPath string expression to create compiler-checked keys and key paths that can be used by KVC methods

例如:

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