iOS:为什么我不能将nil设置为NSDictionary值?
这可能是一个非常基本的问题,但我想知道为什么我不能将nil指定为NSDictionary值? 我在代码中有很多地方有以下声明。 如果[q objectForKey:@"text"]
为零,则应用程序崩溃。
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:2]; [dict setObject:[q objectForKey:@"text"] forKey:@"text"];
在将它分配给字典之前,我必须在每个地方检查零。 这是唯一正确的方法吗? 我错过了什么明显的?
if([q objectForKey:@"text"] != nil) [dict setObject:[q objectForKey:@"text"] forKey:@"text"]; else [dict setObject:@"" forKey:@"text"];
它想要一个实际的对象…使用NSNull
您可以使用setValue:forKey
设置一个零值,但是它会删除键。
如果你想能够设置一个键nil
你可以使用setValue:forKey:
如果你将其设置nil
(从下面的文档引用),它将删除键。 注意值而不是对象。
setValue:forKey:
将给定的键值对添加到字典中。
...
讨论
此方法使用
setObject:forKey:
将值和键添加到字典中,除非值nil
,否则该方法会尝试使用removeObjectForKey:
来移除键。
当你稍后尝试使用objectForKey:
获取对象时objectForKey:
对于通过将其设置nil
来删除的键,您将返回nil
(从下面的文档引用)。
返回值:
与aKey关联的值,如果没有与aKey关联的值,则为nil。
注意:密钥实际上不会出现在字典中,所以不会使用allKeys
获得; 或者被列举过来。
我的朋友使用零作为标记是一个糟糕的编程标志。 零是为了一些不同的目的而保留的。
如果([q objectForKey:@“text”]!= nil) [dict setObject:[q objectForKey:@“text”] forKey:@“text”]; 其他 [dict removeObjectforKey:@“text”]; //如果密钥不存在,这将无能为力。
//默认情况下,所有的键的值是零,你试图覆盖这种行为。 违背语言规则将永远让你陷入困境。
检查只是使用
if([dict objectforKey:@“text”]!= nil){} //这会工作,因为默认值是零 本身
你可以用这种方法设置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)
参数( 根据Apple文档 ):
anObject :
如果anObject为零,则引发invalidArgumentException。 如果您需要在字典中表示一个零值,请使用NSNull。
关键
如果aKey为零,则引发invalidArgumentException。