Iphone iOS:为什么可以';我不能将nil设置为NSDictionary值吗?

Iphone iOS:为什么可以';我不能将nil设置为NSDictionary值吗?,iphone,ios,nsdictionary,null,Iphone,Ios,Nsdictionary,Null,这可能是一个非常基本的问题,但我想知道为什么不能将nil指定为NSDictionary值?我在代码中的许多地方都有下面的语句。如果[q objectForKey:@“text”]为零,则应用程序将崩溃 NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:2]; [dict setObject:[q objectForKey:@"text"] forKey:@"text"]; 在分配给字典之前,我必须

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

它需要一个真实的物体。。。使用

您可以使用
setValue:forKey
设置nil值,但它会删除该键。 如果您希望能够将密钥设置为
nil
,则可以使用该选项,如果您将密钥设置为
nil
(引用以下文档)。请注意,而不是对象

setValue:forKey:
将给定的键值对添加到字典中

...
讨论 此方法使用
setObject:forKey:
将值和键添加到字典中,除非值为
nil
,在这种情况下,该方法会尝试使用
removeObjectForKey:
删除键

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

返回值: 与aKey关联的值,如果没有与aKey关联的值,则为nil


注意:该键实际上不会出现在字典中,因此无法使用
allKeys
获取该键;或者被枚举。

我的朋友使用nil作为标记是糟糕编程的标志。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. if([q objectForKey:@“text”!=nil) [dict setObject:[q objectForKey:@“文本”]forKey:@“文本”]; 其他的 [dict removeObjectforKey:@“text”];//如果密钥不存在,这将不起任何作用。 //默认情况下,所有键的值均为nil,您将尝试覆盖此行为。 违反语言规则总是会给你带来麻烦

检查一下就用

if([dict objectforKey:@"text"] !=nil){} // this will work becuase default value is nil itself 如果([dict objectforKey:@“text”!=nil){}//这将起作用,因为默认值为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)
参数(根据苹果文档):

对象

如果某个对象为nil,则引发invalidArgumentException。如果你需要 要在字典中表示nil值,请使用NSNull

aKey

如果aKey为nil,则引发invalidArgumentException


这看起来很棒。设置NSNull时,条件if([q objectForKey:@“text”]==nil)将为true,还是必须使用if([q objectForKey:@“text”]==NSNull)?谢谢。@AppleDeveloper这不是真的,你必须检查
[NSNull null]
谢谢@peter,所以我需要使用两种不同的条件?如果([q objectForKey:@“text”]==nil)检查键是否存在,如果([q objectForKey:@“text”]==NSNull])检查键是否有空值?@AppleDeveloper因为您不能在
NSDictionary
中存储
nil
,检查它是过时的,因为它永远不会发生。所以,不,不要检查
nil
,只检查
[NSNull null]
@PeterPajchl如果键没有值,它将是nil。我知道,但我必须这样做才能为键设置默认值!你能在不赋值的情况下创建一个键吗?@AppleDeveloper请解释一下,如果有一个没有值的键,你会得到什么…短的ans是no,长的ans是NOOOOOOO。@DavidRönnqvist抱歉,我知道这是不可能的,但我有点讽刺!我正在构建100个键值对,其中一些有值,一些丢失,将由用户填充。我正在生成动态UI控件,因此如果某个键没有答案/默认值,我仍然需要存储该键以供将来参考,并在以后分配该值。@AppleDeveloper我们都在暗示您的设计错误。当两个都有时插入键值(这也将节省内存)。我不知道你的上下文是什么,但你总是可以有一个比插入nil值更好的解决方案。嗨,大卫,谢谢你提供的有用信息,但我在苹果的文档中读到,你只对KVO使用setValue,对于普通的键值对,你应该始终使用setObject!这不是真的吗?@AppleDeveloper据我所知,字典有自己的setValue实现。NSMutableDictionary文档(在我的答案中链接)没有说明不使用它:“
setValue:forKey:
将给定的键值对添加到字典中…”。。。讨论此方法使用
setObject:forKey:
将值和键添加到字典中,除非值为nil,在这种情况下,该方法会尝试使用
removeObjectForKey:
删除键。“这种方法的一个重要限制是
setValue:withKey:
需要一个字符串键。使用其他类型是否安全还不完全清楚,编译器会对此发出警告。我个人认为我应该避免。我认为
NSMutableDictionary
上的一个类别提供
setOrClearObject:forKey:
将是一种更安全的方法。
func setObject(_ anObject: Any, forKey aKey: NSCopying)