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];