NSNumber
CoreDataにスカラーを格納したいときに明示的に変換するという記事をたくさん読んだことがあります。
@property (nonatomic, assign) NSInteger value;
- (NSInteger)value
{
return [value integerValue];
}
- (void)setValue:(NSInteger)val
{
value = [NSNumber numberWithInteger:val];
}
しかし、私たちの古いプロジェクトには、それらの操作を行わない(そしてカスタムアクセサーがない)プロパティがたくさんあります!なぜそれが機能するのですか?
サンプルコード
宣言。スカラー値は一時的なものではありません。
@interface ProductProperty : NSManagedObject
@property (nonatomic, strong, readonly) NSString * propertyID;
@property (nonatomic, strong, readonly) NSString * title;
@property (nonatomic, strong, readonly) NSSet * values;
@property (nonatomic, assign, readonly) BOOL filter;
@property (nonatomic, strong, readonly) NSDate *update;
@property (nonatomic, strong, readonly) NSNumber *index;
@property (nonatomic, assign, readonly) BOOL system;
@end
#import "ProductProperty.h"
@implementation ProductProperty
@dynamic propertyID;
@dynamic title;
@dynamic values;
@dynamic filter;
@dynamic update;
@dynamic index;
@dynamic system;
@end
オブジェクトへのマッピング。受信したJSONが既存のものと異なる場合に呼び出されます。それ以外の場合は、CoreDataストレージからフェッチします。
- (void)updateProperties:(NSArray*)properties
{
for (NSDictionary *_property in properties) {
NSString *propertyID = [_property objectForKey:@"id"];
ProductProperty *property = [state.productPropertiesWithIDs objectForKey:propertyID];
if (!property) {
property = [state.ctx newObjectWithEntityName:ProductProperty.entityName];
property.propertyID = propertyID;
[state.productPropertiesWithIDs setObject:property forKey:propertyID];
}
property.update = state.update;
property.title = [_property objectForKey:@"title"];
property.filter = [_property objectForKey:@"filter"] ? [[_property objectForKey:@"filter"] boolValue] : YES;
property.index = [propertyIndexes objectForKey:propertyID] ? [propertyIndexes objectForKey:propertyID] : [NSNumber numberWithInt:propertyIndex++];
property.system = [SYSTEM_PROPERTY_IDS containsObject:propertyID] ? YES : NO;
[self updatePropertyValues:[_property objectForKey:@"values"] forProperty:property];
}
}
- (ProductProperty*)productPropertyWithID:(NSString*)propertyId error:(NSError**)error
{
NSFetchRequest *req = [ProductProperty request];
req.predicate = [NSPredicate predicateWithFormat:@"propertyID == %@", propertyId];
return [[ctx executeFetchRequest:req error:error] lastObject];
}