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

问题描述 投票:0回答:2

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

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

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

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

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

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

ios swift core-data key nsmanagedobject
2个回答
1
投票

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

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

例如:

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


0
投票

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

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

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

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.