核心数据支持NSNull

时间:2011-05-27 18:39:47

标签: iphone objective-c core-data

是否可以让Core Data允许分配NSNull?我正在使用JSONKit,默认情况下会分配NSNull。我希望能够像这样进行反序列化:

- (void)deserialize:(NSDictionary *)dictionary
{
  self.name = [dictionary objectForKey:@"name"];
} 

而不是这样:

- (void)deserialize:(NSDictionary *)dictionary
{
   NSNull *null = [NSNull null];
   NSString *value = [dictionary objectForKey:@"name"];
   self.name = (value != null) ? value : nil;
}

3 个答案:

答案 0 :(得分:4)

一种想法是为NSDictionary创建一个类别。然后,该类别可以包含此行为。

答案 1 :(得分:4)

我不认为CoreData可以做到这一点。

但如果代码简洁如果你正在寻找什么,你可以只使用宏:

#define NULL_NIL(_O) _O != [NSNull null] ? _O : nil
#define DICT_GET(_DICT, _KEY) NULL_NIL([_DICT objectForKey:_KEY])
#define DICT_GET_INT(_DICT, _KEY) [DICT_GET(_DICT, _KEY) intValue]
...

不是我要说的优化,而是带来简洁易读的代码:

- (void)deserialize:(NSDictionary *)dictionary
{
  self.name = DICT_GET(dictionary, @"name");
} 

答案 2 :(得分:2)

如果你必须处理多种集合类型(不仅仅是字典),你可以在NSNull上创建一个类别:

@implementation NSNull (NSNull_nilIfNull)
+ (id)nilIfNull:(id)object {
    if (object == [self null]) {
        return nil;
    }
    return object;
}
@end

实现:

theValue = [NSNull nilIfNull:[array objectAtIndex:someIndex]];

但我必须说它增加了不必要的冗长。我喜欢使用Vincent G的预处理器宏来保持代码可读的想法。