我在理解这个compare-using-selector
事件背后的逻辑时遇到了一些麻烦。
我有以下代码,我正在尝试提取密钥并同时对它们进行排序。但是,它没有排序。无论我做什么,输出NSArray的顺序都不会改变。
NSMutableDictionary *dictToSort = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"Joe", [NSNumber numberWithInt:2], @"mark", [NSNumber numberWithInt:1], @"mdark", [NSNumber numberWithInt:3], nil];
NSArray *dictToSortKeys = [dictToSort keysSortedByValueUsingSelector:@selector(compare:)];
NSLog(@"Not Sorted" );
NSNumber *xx = dictToSortKeys[0];
NSNumber *xy = dictToSortKeys[1];
NSNumber *xz = dictToSortKeys[2];
NSLog(@"Sorted %d %d %d", xx.integerValue , xy.integerValue, xz.integerValue);
我不了解这个compare:
函数是如何工作的。它表示返回NSOrderedAscending, NSOrderedSame or NSOrderedDescending
,但无法接收这些返回。而且,这应该神奇地工作?对于这种比较,文档很差。
答案 0 :(得分:7)
我认为你对keysSortedByValueUsingSelector:
的作用感到困惑。它按值对字典条目进行排序,并按顺序返回键。
您的词典包含以下条目:
Key Value
--- -----
1 mark
2 Joe
3 mdark
keysSortedByValueUsingSelector:
方法通过“值”列有效地对该表进行排序:
Key Value
--- -----
2 Joe
1 mark
3 mdark
(请注意,Joe
按字母顺序排在mark
之前,而mark
按字母顺序排在mdark
之前。)
然后它按照刚才计算的顺序返回一个键数组:@[ @2, @1, @3 ]
。
请注意,keysSortedByValueUsingSelector:
从不比较密钥。 仅比较值。
如果您想通过密钥本身对密钥数组进行排序,请执行以下操作:
NSArray *dictToSortKeys = [dictToSort.allKeys
sortedArrayUsingSelector:@selector(compare:)];