gpt4 book ai didi

objective-c - 为什么 NSString 的 NSArray 可以作为 NSMutableDictionary 的键?

转载 作者:行者123 更新时间:2023-12-03 17:49:24 27 4
gpt4 key购买 nike

我已经尝试解决这个问题有一段时间了,但我并不完全清楚它为什么或如何工作。

我需要存储一对映射到对象的标识符(单独存储,因此它们不能连接在一起)。最初,我为此使用了顶级 NSMutableDictionary 实例,并在其下面嵌套了 NSMutableDictionary 对象。要检索标识符对的值,我可以调用:

[[myTopLevelDictionary objectForKey:key1] objectForKey:key2]

即使跟踪嵌套的 NSMutableDictionary 实例需要一些额外的工作,这也能很好地工作。

昨天,我想知道是否有任何方法可以直接使用一对 NSString 对象作为键。因此,我尝试使用两个 NSString 对象创建一个 NSArray 实例,并使用它作为键,它起作用了:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSArray *key = [NSArray arrayWithObjects:@"A", @"B", nil];

[dict setObject:@"foobar" forKey:key];

NSLog(@"%@", [dict objectForKey:key]);
NSLog(@"%@", [NSArray arrayWithObjects:@"A", @"B", nil];

// Even this seems to work?
NSMutableArray *key2 = [NSMutableArray arrayWithObjects:@"A", @"B", @"C", nil];
[key2 removeLastObject];

NSLog(@"%@", key2);

所有三种情况都将成功打印“foobar”。如果我更改数组中 NSString 对象的顺序,则字典将返回 nil 。如果我添加或删除 NSString 对象,字典将再次正确返回 nil。只有具有正确 NSString 对象且包含正确顺序的正确内容的 NSArray 对象似乎才能检索到适当的值。

我的问题是...为什么会起作用以及如何起作用?

我知道哈希与它有关,但是将哈希发送到 NSArray 对象似乎只是返回对象计数,所以我无法想象这与它有多大关系。然后我想也许 NSDictionary 试图获取 NSArray 的描述并将其用作基于字符串的键,但我不确定如何测试这个理论,因为 NSString 的哈希与 NSArray 的哈希不同(所以我不能只是使用复制 [[NSArray arrayWithObjects:@"A", @"B", nil] description]) 输出的 NSString 键。

别误会我的意思,如果我能像这样使用 NSArray/NSString/NSMutableDictionary 那就太好了,我只是想确保事情按照我认为的方式工作,而这不是一些某种奇怪的未定义行为或其他东西。

最佳答案

无论您使用什么“键”作为字典的键/值输入,都将被散列并在内部用作真正的键。使用数组作为键时必须非常小心,因为如果对它进行任何修改,它的哈希值都会改变,因此您将无法再访问该值。

为了回答你的问题,它是有效的,因为 key (NSArray)可以被散列。它是如何工作的:因为存储的“key”是 NSArray 的哈希值,而不是数组本身(出于性能和存储大小的原因)。当您使用 NSString 作为键时,它会执行相同的操作并在内部存储字符串的哈希值。

关于objective-c - 为什么 NSString 的 NSArray 可以作为 NSMutableDictionary 的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31891378/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com