对于NSKeyValueCoding可以处理的结构类型的属性,我使用Apple的文档here中描述的Core Data访问器模式。
例如,可以在Core Data模型中指定NSRange结构,类型为Transformable,然后通过在表单的NSManagedObject子类中提供访问器,可以避免客户端的NSValue rigmarole:
接口
@property(assign, nonatomic) NSRange range;
实施;
- (NSRange) range {
[self willAccessValueForKey:@"range"];
NSRange retVal = range;
[self didAccessValueForKey:@"range"];
return retVal;
}
- (void)setRange:(NSRange)aRange {
[self willChangeValueForKey:@"range"];
range = aRange;
[self didChangeValueForKey:@"range"];
}
但是,Mogenerator生成的NSManagedObject子类将Transformable属性声明为NSObject属性,因此客户端需要获取/设置NSValues。
使用mogenerator处理这种情况的最佳方法是什么,同时(1)保持简单的Transformable模式而不是弄乱瞬态背衬属性,以及(2)避免对Mogenerator的“机器”类进行任何编辑?
答案 0 :(得分:1)
处理此问题的最终方法是,正如scc在之前接受的答案中所建议的那样,更改生成器模板文件。他们需要(a)将可转换属性的访问者更改为适当的类型(本例中为NSRange),然后(b)使用适当的KVO方法调用添加访问者。
由于我现在有时间想弄明白该怎么做,我的临时权宜之计如下:
不太理想,但我确实得到了强类型的访问器,而无需编辑mogenerator机器文件。
答案 1 :(得分:0)
在模型对象生成器完成其作业后,只需将类型从NSObject
更改为您需要的任何类型。在此之后,您不应该有任何编译器警告。
顺便说一句,当我在定义可转换属性后运行托管对象模型生成器时,我得不到NSObject
而是id
。没有警告。
答案 2 :(得分:0)
您可以更改mogenerator使用的模板文件吗? (我认为)如果您远离标量值,则可以安全地使用NSObject *
代替id
。
答案 3 :(得分:0)
对于那些愿意编辑机器模板文件的人,请对可转换的NSRange属性使用以下条件特殊情况。
<$if Attribute.hasTransformableAttributeType && Attribute.objectAttributeClassName == "NSRange" $>
以下是我更改机器模板头文件的方法。 https://gist.github.com/2414047
答案 4 :(得分:0)
您正在阅读文档的错误部分。请查看here:
NSRange
不需要转换。所有这些基本结构都有方法,例如:
NSRangeFromString();
NSStringFromRange();
因此,您可以将shadow属性定义为rangeAsString
类型的“NSString
”。
在您的MO子类中,您将在文档中跟踪如何正确转换和存储值,以便核心数据知道您的对象在执行此操作时变脏:
myObject.range = NSMakeRange(0,5);