将 nil 分配给 Objective-C 中 NSMutableDictionary 上的一个元素会删除该元素,这是一个被认可的功能还是错误?

Assigning nil to an element on NSMutableDictionary in Objective-C removes that element, is that a sanctioned feature or bug?

我有一个NSMutableDictionary

NSMutableDictionary * dict = @{
                                @"0" : @"car",
                                @"1" : @"ball",
                                @"2" : @"plane",
}

有一次,我错误地将 nil 赋给了字典中的一个元素。例如:

  dict[@"1"] = nil; 

令我惊讶的是,元素“1”没有崩溃,而是被删除了。

这是最近的事情吗?批准的功能还是错误?我想知道这是否是一个功能,因为我总是使用类似

的东西
[dict removeObjectForKey:@"1"];

从字典中删除对象。

我从来不知道这是可能的。也许 Apple 正在使 Objective-C 类似于 Swift。

我刚刚验证了 Swift 2.0 中的行为。

var dict: NSMutableDictionary = [ "0" : "car", "1" : "ball", "2" : "plane" ];
dict["1"] = nil
print("\(dict)")

这肯定是一个错误,因为它与文档相矛盾。

来自NSMutableDictionary Class Reference

- setObject:forKeyedSubscript: Adds a given key-value pair to the dictionary.

Declaration

OBJECTIVE-C

- (void)setObject:(ObjectType)object
forKeyedSubscript:(id)aKey

Parameters

object

The value for aKey. A strong reference to the object is maintained by the dictionary.

IMPORTANT

Raises an NSInvalidArgumentException if anObject is nil. If you need to represent a nil value in the dictionary, use NSNull.

aKey

The key for value. The key is copied (using copyWithZone:; keys must conform to the NSCopying protocol). If aKey already exists in the dictionary, anObject takes its place.

IMPORTANT

Raises an NSInvalidArgumentException if aKey is nil.


更新:2016-04-21

Apple 已更新其文档!传递 nil 值可用于删除键。

object

The value for aKey. A strong reference to the object is maintained by the dictionary.

Passing nil will cause any object corresponding to aKey to be removed from the dictionary.

有不同的 API 可以将对象添加到可变字典中,当您传递 nil:

时,它们的行为会有所不同
  • setObject:forKeyedSubscript: (a.k.a dict[key] = nil) 和 setValue:forKey: 接受 nil ,在这种情况下,他们将删除与该键对应的关联对象。
  • 如果传递
  • setObject:forKey: 将引发异常

所有这些都记录在 https://developer.apple.com/documentation/foundation/nsmutabledictionary