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


这可能是

非常基本的问题,但我想知道为什么我不能将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: 将值和键添加到字典中,除非 value nil在这种情况下,该方法会尝试使用 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本身

最新更新