Objective c 如何在NSDictionary中交换键和值?

Objective c 如何在NSDictionary中交换键和值?,objective-c,nsdictionary,foundation,Objective C,Nsdictionary,Foundation,我想知道如何颠倒字典 我见过一些疯狂的代码,比如 NSDictionary *dict = ...; NSDictionary *swapped = [NSDictionary dictionaryWithObjects:dict.allKeys forKeys:dict.allValues]; 根据文档,这是完全不安全的,因为不能保证所有值和所有键的顺序 NSDictionary *dict = ...; NSMutableDictionary *swapped = [NSMuta

我想知道如何颠倒字典

我见过一些疯狂的代码,比如

NSDictionary *dict = ...;
NSDictionary *swapped  = [NSDictionary dictionaryWithObjects:dict.allKeys forKeys:dict.allValues];
根据文档,这是完全不安全的,因为不能保证
所有值
所有键
的顺序

NSDictionary *dict = ...;    
NSMutableDictionary *swapped = [NSMutableDictionary new];
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
    swapped[value] = key;
}];

请注意,这些值还应符合
NSCopying
协议

没错,这段代码很疯狂,但是有两种方法可以按照键数组给出的顺序获取值数组:

NSArray * keys = [dict allKeys];
NSArray * vals = [dict objectsForKeys:keys notFoundMarker:nil];

NSDictionary * inverseDict = [NSDictionary dictionaryWithObjects:keys
                                                         forKeys:vals];


前者显然要好得多。如上所述,作为原始字典中的值的对象必须符合
NSCopying
,才能用作反转中的键。

如果原始字典中的值(将成为反转字典中的键)不唯一,这些解决方案是否有效?我从未在这个约束下测试过特定的初始值设定项(有几个循环键)。
NSUInteger count = [dict count];
id keys[count];
id vals[count];
[dict getObjects:vals andKeys:keys];

NSDictionary * inverseDict = [NSDictionary dictionaryWithObjects:keys
                                                         forKeys:vals
                                                           count:count];