核心数据支持NSNull

问题描述

| 是否有可能获得允许分配“ 0”的核心数据?我正在使用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;
}
    

解决方法

        一种想法是为NSDictionary创建一个类别。然后类别可以包含此行为。     ,        我认为使用
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\");
} 
    ,        如果必须处理多种集合类型(而不仅仅是字典),则可以在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 \的预处理器宏来保持代码可读性的想法。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...