2012年12月16日日曜日

Objective-Cの高速列挙は順番保証されない

どうも、俺@勉強中です。

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 件のコメント: