47

这可能是一个非常基本的问题,但我想知道为什么我不能将 nil 分配为 NSDictionary 值?我的代码中有很多地方都有以下声明。如果[q objectForKey:@"text"]为 nil,则 App 正在崩溃。

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"];
4

5 回答 5

70

它想要一个实际的对象......使用NSNull

[NSNull null];
于 2012-08-17T15:09:07.290 回答
51

可以使用设置 nil 值,setValue:forKey但它会删除密钥。

如果您希望能够设置一个密钥,nil您可以使用setValue:forKey:which 将删除密钥,如果您将其设置为nil(引用以下文档)。注意而不是对象。

setValue:forKey:

将给定的键值对添加到字典中。

...
讨论

此方法使用 向字典添加值和键setObject:forKey:,除非nil在这种情况下,该方法尝试使用 删除键removeObjectForKey:

当您稍后尝试通过将对象objectForKey:设置为您删除的密钥来获取对象时,nil您将得到nil返回(引用以下文档)。

返回值:

与 aKey 关联的值,如果没有与 aKey 关联的值,则为 nil。

注意:该键实际上不会出现在字典中,因此不会使用allKeys;获取它。或一一列举。

于 2012-08-17T15:12:36.420 回答
5

您可以通过这种方式设置 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"];
于 2016-01-05T10:46:20.343 回答
1

使用此方法时:

func setObject(_ anObject: Any, forKey aKey: NSCopying)

参数(根据 Apple 文档):

一个对象

如果 anObject 为 nil,则引发 invalidArgumentException。如果您需要在字典中表示 nil 值,请使用 NSNull 。

关键

如果 aKey 为 nil,则引发 invalidArgumentException。

于 2017-09-25T07:10:51.923 回答
0

我的朋友使用 nil 作为标记是不良编程的标志。nil 保留用于某些不同的目的。

if([q objectForKey:@"text"] != nil)
    [dict setObject:[q objectForKey:@"text"] forKey:@"text"];
别的
    [dict removeObjectforKey:@"text"]; // 如果 key 不存在,这将不做任何事情。

//默认情况下,所有键的值都是 nil 并且您正在尝试覆盖此行为。违反语言规则总是会给你带来麻烦。

检查只是使用

if([dict objectforKey:@"text"] !=nil){} // 这将起作用,因为默认值为 nil
本身
于 2012-08-17T15:15:48.530 回答