Objective-C error: Property 'active' is a scalar type on class 'Routine'. Cannot generate a getter method for it

我怕爱的太早我们不能终老 提交于 2019-12-04 04:24:33
Louis Gerbarg

Everything that comes out of CD is an object, not a scaler. So, changer your code to:

@interface Routine : NSManagedObject {

}

@property (nonatomic) NSNumber * active;

@implementation Routine
@dynamic active
@end

If you want you can add a convenience accessor to deal with it as a scalar:

- (BOOL) activeScalar {
  return self.active.boolValue;
}

- (void) setActiveScalar:(BOOL)active_ {
  self.active = [NSNumber numberWithBool:active_];
}

Finally, if you control-click on a property in the model editor it will bring up an enormous contextual menu, including options to copy the appropriate declarations and definitions into your paste board, so you don't have to write them yourself.

For what it's worth, I found the docs provide a slightly different solution to scalars. Generally you're discouraged from using scalars instead of objects, but if you do then http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html explains how to do it. You use the "primitiveName" and "setPrimitiveName" to access automatically generated accessors that put your scalar into an object (e.g. NSNumber). Then create a scalar @property and write accessors for your property that use the primitives.

This seems expensive in that under the hood CoreData is storing your attribute as a scalar in the peristent store and converting it to an object to expose it as a primitive. So when you implement setName, as I read the docs and sample code, your value is placed in an object and then the scalar is extracted again in the setPrimitiveName automatic implementation. Seems like unnecessary marshaling back and forth for each get or set.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!