这可能是一个非常基本的问题,但我想知道为什么我不能将nil指定为NSDictionary值?我在我的代码中有很多地方。如果[q objectForKey:@"text"]
为零,则App崩溃。
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"];
答案 0 :(得分:62)
它想要一个实际的对象......使用NSNull
答案 1 :(得分:49)
setValue:forKey
设置一个零值,但它会删除密钥。如果您希望能够将密钥设置为nil
,则可以使用setValue:forKey:
,如果将密钥设置为nil
,则会删除该密钥(引自下面的文档)。请注意值而不是对象。
setValue:forKey:
将一个给定的键值对添加到字典中。
的讨论强>...
此方法使用
setObject:forKey:
为字典添加值和键,除非值为nil
,在这种情况下,该方法会尝试使用removeObjectForKey:
删除密钥。
当您稍后尝试使用objectForKey:
获取对象时,通过将其设置为nil
来删除该密钥,您将获得nil
(请参阅下面的文档)。
返回值与aKey关联的值,如果没有值与aKey关联,则为nil。
注意:密钥实际上不会出现在字典中,因此无法使用allKeys
获取密钥。或者被列举。
答案 2 :(得分:2)
您可以这样设置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"];
答案 3 :(得分:1)
使用此方法时:
func setObject(_ anObject: Any, forKey aKey: NSCopying)
参数(根据Apple doc的):
<强> anObject 强>:
如果anObject为nil,则引发invalidArgumentException。如果你需要 要在字典中表示零值,请使用NSNull。
<强>的aKey 强>
如果aKey为nil,则引发invalidArgumentException。
答案 4 :(得分:0)
我的朋友使用nil作为标记是编程错误的表现。零保留用于某些不同的目的。
if([q objectForKey:@"text"] != nil) [dict setObject:[q objectForKey:@"text"] forKey:@"text"]; else [dict removeObjectforKey:@"text"]; // this will do nothing if key does not exsist.
//默认情况下,对于所有键,值为nil,并且您尝试覆盖此行为。 违反语言规则总会让你陷入困境。
检查使用
if([dict objectforKey:@"text"] !=nil){} // this will work becuase default value is nil itself