我有一个讨厌的问题。在 coredata 中,我有一个名为"类别"的实体,我想要一个默认类别,用户无法删除、编辑等。此默认类别称为"0_default_category"(存储在常量 kSettingsLocalizedDefaultCategory 中),当向用户显示时,此名称将替换为本地化字符串。为此,我覆盖了getter:
-(NSString *)name
{
if([[self primitiveValueForKey:@"name"] isEqualToString:kSettingsLocalizedDefaultCategory]){
return NSLocalizedString(kSettingsLocalizedDefaultCategory, nil);
} else {
return [self primitiveValueForKey:@"name"];
}
}
现在我当然想在常量上使用谓词,而不是本地化字符串!但这在本地化字符串上使用谓词(所以我的 getter 被调用,我不想要......
request.predicate = [NSPredicate predicateWithFormat:@"name != %@", kSettingsLocalizedDefaultCategory];
知道我如何预测原始值吗?
我认为您将两个单独的问题混为一谈。一个事实是,您有一些特殊的逻辑(您的常量)来自动显示本地化字符串。另一种是返回存储在属性name
中的值。
理想情况下,应将这两个分开,以明确这两个问题。因此,您不应该重写 name
的 getter,而应该创建一个具有不同名称的自定义方法(或派生属性,根据您的需要)。
-(NSString*)displayName {
return [self.name isEqualToString:kConstant] ?
NSLocalizedString(kConstant) : self.name;
}
如果要使用自定义逻辑显示名称,请使用 displayName
,并将谓词保留为
[NSPredicate predicateWithFormat:@"name != %@", kConstant];