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。