C0deH4cker がすでに述べたように、概念的には NSDictionary はソートされていません。
順序が必要な場合は、キーを配列に書き込むことができます (ただし、キーがディクショナリから削除された後、配列がそれを保持するのに問題があるかもしれませんが、保持しない配列を作成する方法については、 CFArray ) またはNSSortedSet。
または、NSDictionary をサブクラス化することもできます — NSDictionary はクラス クラスターであるため、それほど簡単ではありません。しかし幸運なことに、Matt は彼の素晴らしいブログ記事「OrderedDictionary: Cocoa クラス クラスタのサブクラス化」で、ちょっとしたトリックであるhas-a関係の使い方を示しています。
あなたのコードに注意してください
NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {
if ( first < second ) {
return (NSComparisonResult)NSOrderedAscending;
} else if ( first > second ) {
return (NSComparisonResult)NSOrderedDescending;
} else {
return (NSComparisonResult)NSOrderedSame;
}
}];
C演算子をオブジェクトに適用しているので、やりたいことはしません。これで、それらのポインタが順序付けられます。
それは次のようなものでなければなりません
NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {
return [first compare:second];
}];
または、オブジェクトとしてのラッパーであるスカラーで注文する場合 (つまり、NSNumber)
NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {
if ([first integerValue] > [second integerValue])
return (NSComparisonResult)NSOrderedDescending;
if ([first integerValue] < [second integerValue])
return (NSComparisonResult)NSOrderedAscending;
return (NSComparisonResult)NSOrderedSame;
}];