NSNumber是NSDictionary的关键

pro*_*ock 16 objective-c

我想知道密钥在NSDictionary中是如何工作的.通常,我会使用NSString作为键,例如:

NSString *stringKey = @"stringKey";
[mydict objectForKey:stringKey];
Run Code Online (Sandbox Code Playgroud)

如果我想使用NSNumber怎么办:

NSNumber *numberKey = [NSNumber numberWithInt:3];
[mydict objectForKey:numberKey];
Run Code Online (Sandbox Code Playgroud)

字典是否会查找3号键?或者它只是比较numberKey的地址?

Dav*_*ong 14

当且仅当,两个键是相等的[key1 isEqual:key2].一些类可能与去-[NSObject isEqual:]实施return self == other;,但它的类很常见(如NSString,NSNumber等)来覆盖它做的更具体的上下文的比较.

  • @Joe` [key1 hash] == [key2 hash]`只保证为iff` [key1 isEqual:key2]`.因此,如果2个键相等,则您知道它们的哈希值也必须相等.但是,相等的哈希值并不意味着相等的物体.(有关更多信息,请查看` - [<NSObject> hash]`文档) (5认同)
  • @DaveDeLong因此,当用作字典键时,使用完全相同的值(例如,3.2f)创建的两个不同的`NSNumber`实例将被视为等效的?`-setObject:forKey:`替换现有的条目,还是总是创建一个新条目?你的答案似乎没有给出这个问题的明确答案. (2认同)
  • 算了吧; 我在代码中对它进行了测试,似乎`NSNumber`的不同但算术等效的实例产生了相同的字典键(这是有意义的). (2认同)