iOS:为什么我不能将nil设置为NSDictionary值?

时间:2012-08-17 15:07:09

标签: iphone ios nsdictionary null

这可能是一个非常基本的问题,但我想知道为什么我不能将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"];

5 个答案:

答案 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