我有NSMutableDictionary
。
NSMutableDictionary * dict = @{
@"0" : @"car",
@"1" : @"ball",
@"2" : @"plane",
}
有一次,由于错误,我正在为字典上的元素分配一个nil。例如:
dict[@"1"] = nil;
令我惊讶的是,而不是崩溃,元素" 1"正在删除。
这是近期的事吗?受制裁的功能还是错误?我想知道这是否是一个功能,因为我总是使用像
这样的东西[dict removeObjectForKey:@"1"];
从字典中删除对象。
我从来不知道这是可能的。也许Apple正在使Objective-C与Swift相似。
答案 0 :(得分:8)
我刚刚验证了Swift 2.0中的行为。
var dict: NSMutableDictionary = [ "0" : "car", "1" : "ball", "2" : "plane" ];
dict["1"] = nil
print("\(dict)")
它必须是一个bug,因为它与文档相矛盾。
来自NSMutableDictionary Class Reference:
- setObject:forKeyedSubscript: 将给定的键值对添加到字典中。
声明
目的-C
- (void)setObject:(ObjectType)对象
forKeyedSubscript:(ID)的aKey
参数
宾语aKey的值。字典维护了对象的强引用。
重要如果anObject为nil ,则引发NSInvalidArgumentException。如果需要在字典中表示nil值,请使用NSNull。
关键价值的关键。密钥被复制(使用copyWithZone:;密钥必须符合NSCopying协议)。如果字典中已存在aKey,则anObject取代它。
重要如果aKey为nil,则引发NSInvalidArgumentException。
更新时间:2016-04-21
Apple更新了它的文档!传递nil
值可用于删除密钥。
宾语aKey的值。字典维护了对象的强引用。
传递nil会导致对应于aKey的任何对象从字典中删除。
答案 1 :(得分:0)
有不同的 API 可以将对象添加到可变字典,并且当您传递 nil
时它们的行为会有所不同:
setObject:forKeyedSubscript:
(又名 dict[key] = nil
)和 setValue:forKey:
接受 nil
,在这种情况下,它们将删除与该键对应的对象。setObject:forKey:
如果通过 nil
将引发异常所有这些都记录在 https://developer.apple.com/documentation/foundation/nsmutabledictionary