非常基本的问题,但我想知道为什么我不能将nil作为NSDictionary值?我的代码中有很多地方都有以下语句。如果[q objectForKey:@"text"]
为零,则应用程序崩溃。
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:2];
[dict setObject:[q objectForKey:@"text"] forKey:@"text"];
在将其分配给字典之前,我必须在任何地方检查 nil。这是唯一正确的做法吗?我错过了一些明显的东西吗?
if([q objectForKey:@"text"] != nil)
[dict setObject:[q objectForKey:@"text"] forKey:@"text"];
else
[dict setObject:@"" forKey:@"text"];
它想要一个实际的对象...使用 NSNull
[NSNull null];
setValue:forKey
设置nil值,但它会删除键。
如果您希望能够将密钥设置为nil
则可以使用setValue:forKey:
,如果将其设置为nil
,它将删除该密钥(引用自下面的文档)。请注意值而不是对象。
setValue:forKey:
将给定的键值对添加到字典中。
讨论...
此方法使用
setObject:forKey:
将值和键添加到字典中,除非 valuenil
在这种情况下,该方法会尝试使用removeObjectForKey:
删除键。
当您稍后尝试使用 objectForKey:
获取对象时,通过将其设置为 nil
来删除的键,您将得到nil
(引用自下面的文档)。
返回值:与 aKey 关联的值,如果没有值与 aKey 关联,则为 nil。
注意:该键实际上不会出现在字典中,因此不会使用 allKeys
获取它;也不会枚举。
你可以这样设置 nil 对象:
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
dictionary[@“key”] = nil;
你注意到了吗?
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
/* this statement is safe to execute */
dictionary[@“key”] = nil;
/* but this statement will crash application */
[dictionary setObject:nil forKey:@"key"];
使用此方法时:
func setObject(_ anObject: Any, forKey aKey: NSCopying)
参数(根据苹果文档):
对象:
如果 Object 为 nil,则引发 invalidArgumentException。如果您需要 要表示字典中的 nil 值,请使用 NSNull 。
aKey
如果 aKey 为 nil,则引发 invalidArgumentException。
我的朋友使用 nil 作为标记是编程不良的标志。 nil 是为一些不同的目的保留的。
if([q objectForKey:@"text"] != nil) [dict setObject:[q objectForKey:@"text"] forKey:@"text"];还 [dict removeObjectforKey:@"text"];如果密钥不存在,这将不执行任何操作。
默认情况下,所有键的值均为 nil,您正在尝试覆盖此行为。违反语言规则总是会给你带来麻烦。
要检查只需使用
if([dict objectforKey:@"text"] !=nil){}//这将起作用,因为默认值为 nil本身