NSDictionaray dictionaryWithObjectsAndKeys添加NULL值

|| 我想用+ [NSDictionary dictionaryWithObjectsAndKeys:]创建一个NSDictionary。我的键之一有一个字符串,但是该字符串有时可以是
nil
。如果字符串是“ 0”,则我随后放置的任何其他值键对都将被忽略,因为列表过早终止。处理ѭ3中可能有ѭ0的值的可能性的标准方法是什么?     
已邀请:
        您需要检查字符串是否为空。如果是,请添加
[NSNull null]
代替字符串。     
        如果您有许多对象(如果它们为零),则创建NSDictionary对象可能会很麻烦,因为它们不应该包含在字典中。 对我来说,NSNull和解决方案一样是一个大问题。创建NSDictionary对象以用于其他对象时,处理nil值时可以采用两种方法。您可以将NSNull对象添加到字典中-然后在读取值时检查NSNull值。这样就可以在创建时编写漂亮的代码,但是在读取值时会变得混乱。例如您应该检查字典中的所有键,还是保证某些键不为零?并且,如果未滤除NSNull值,则在尝试发送对象消息时必然会导致异常。 第二种方法是不将NSNull值添加到字典中。在读取NSDictionary时,这很方便,因为[someDictionary objectForKey:someKey]在未设置键的情况下仅返回nil。这种方法在读取值时非常简单,但实际上在创建时注定是凌乱的代码。例如创建一个NSMutableDictionary,在添加值之前检查nil,最后返回一个不变的副本吗? 解 对我来说,解决方案是创建两个类别,从本质上讲,这两个类别使创建和阅读都变得容易。 创建NSDictionary时,您只需将可能的nil值包装成这样
[NSDictionary dictionaryWithObjectsAndKeysIngoringNull:
 [NSNull nullWhenNil:val1], @\"value1\",
 [NSNull nullWhenNil:val2], @\"value2\",
 ...
 nil];
该代码几乎与方法一一样简单,但是在读出值时却变得相当容易。 类别如下(在启用ARC的代码和非ARC代码中均可使用): NSDictionary添加:
@implementation NSDictionary (NullAddition)

+ (id)dictionaryWithObjectsAndKeysIngnoringNull:(id)firstObject, ... {

    NSMutableArray* objects = [NSMutableArray array];
    NSMutableArray* keys = [NSMutableArray array];

    va_list args;
    va_start(args, firstObject);

    for (id object = firstObject; object; object = va_arg(args, id)) {

        id key = va_arg(args, id);

        if (!key)
            break;

        if (![object isKindOfClass:[NSNull class]]) {
            [objects addObject:object];
            [keys addObject:key];
        }

    }

    va_end(args);

    return [self dictionaryWithObjects:objects forKeys:keys];

}

@end
NSNull加法
@implementation NSNull (NullAddition)

+ (id)nullWhenNil:(id)obj {

    return (obj ? obj : [self null]);

}

@end
祝好运!     
        尝试将数据(键或值)插入“ 3”会导致运行时错误。因此,您不必在字典中处理空数据。
\'-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Test)\'
\'-[__NSCFDictionary setObject:forKey:]: attempt to insert nil key\'
但是,这意味着您有责任在将数据放入字典之前检查数据的有效性,以防止崩溃。     

要回复问题请先登录注册