Objective-Cの高速列挙(for ... in ...)は配列全体を走査するのにとても便利なんだけど、取得される順番が保証されません。
# NSDictonaryのキーの順番通りに値を取り出したい!とする。
NSDictionary *dictionary = @{
@"1": @{@"name":@"bob"},
@"2": @{@"name":@"ken"},
@"3": @{@"name":@"john"},
@"4": @{@"name":@"mike"},
@"5": @{@"name":@"kozy"},
@"6": @{@"name":@"shorn"},
@"7": @{@"name":@"scott"},
@"8": @{@"name":@"mikeal"},
@"9": @{@"name":@"fun"}
};
for (id key in dictionary) {
NSLog(@"%@", key); // 1,2,3,...と出てくれない
}
順番通りに取り出したい時困る。なので回避策としてNSArray#sortedArrayUsingComparatorを使う方法があります。
// 一旦NSDictionaryのキーを取得して
NSArray *keys = [dictionary allKeys];
// sortedArrayUsingComparatorを使ってキーをソート
keys = [keys sortedArrayUsingComparator:^(id o1, id o2) {
return [o1 compare:o2];
}];
// 確認すると順番通りそ
NSLog(@"%@", keys);
NSMutableArray *array = [NSMutableArray array];
// あとは順番通りに値を取得する
for (id key in keys) {
[array addObject:[dictionary objectForKey:key]];
}
// 完璧!
NSLog(@"%@", array);
これで最初のNSDictionaryのキー順番通りに値を取得できます以上でぇぇえぇぇす。
0 件のコメント:
コメントを投稿