5

我已经开始使用 CoreData 编写一个 iPhone 应用程序,并尝试使我的代码库尽可能地可维护。因此,我想避免硬编码字符串,例如:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", aName];

相反,我希望能够编写如下内容:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", Person.name, aName];

这样我会让编译器检查是否name是实体的属性Person并避免拼写错误。

使用此代码虽然我在编译时收到以下错误:name在类型的对象上找不到属性Person

Person属于类型NSManagedObject并由 Xcode 从我的MyApp.xcdatamodeld.

name是实体的简单字符串属性Person

我已经用谷歌搜索并搜索了很多内容来回答这个特定问题。到目前为止,我也尝试过使用property_getName并且没有运气。NSPropertyDescription

提前感谢您的帮助,

乔斯。

4

2 回答 2

4

首先,Person.name不存在,因为“名称”是人员实例的属性,而不是类级别的属性。

我不确定从编译器检查的方法名称到字符串是否有一条非常清晰的路径。您始终可以使用较低级别的方法来访问类中的方法签名并从中获取字符串,但这些方法的起点是未经检查的字符串(C 或 ObjC)。

通常,如果名称错误,谓词的使用会给您带来错误,因此任何使用谓词的测试都将验证您的方法名称是否正确。

您应该使用 Mogenerator 来生成与模型一起使用的数据对象。在这种情况下,您可以考虑更改模板以添加名为“stringForMethodNamed*Name*”之类的方法,并将其作为参数之一包含在格式化谓词中。

于 2013-01-03T16:39:43.280 回答
4

如果您确实使用 Mogenerator,根据 Kendall 的出色建议,在自动生成的类中,您将struct在标题中声明三个 s - EntityNameAttributesEntityNameRelationshipsEntityNameFetchedProperties. 因此,例如,如果您的实体名为Person,并且具有属性name,则可以使用 访问密钥PersonAttributes.name。这将允许您避免在应用程序代码中使用硬编码的键名。

于 2013-01-03T18:04:42.147 回答