2

このブロックコードを解釈しようとしています:

シナリオ 1

NSIndexSet* indexes = [[self.orderItems allKeys] indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        IODItem* key = obj;
        return [searchItem.name isEqualToString:key.name] && searchItem.price == key.price;
    }];

では、self.orderItems ディクショナリの allKeys を取得し、id obj としてブロック {} に渡します。ブロック内で、その obj は IODItem *key に割り当てられます。次に、両方の呼び出し isEqualToString は、コンパレータ == と同様に BOOL を返します。ブロックの戻り値の型が BOOL であるため、これは理にかなっています。では、インデックスの NSIndexSet はどのように満たされるのでしょうか?

シナリオ 2

NSArray* keys = [[self.orderItems allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        IODItem* item1 = (IODItem*)obj1;
        IODItem* item2 = (IODItem*)obj2;
        return [item1.name compare:item2.name];
    }];

そのため、その辞書の allKeys を再度取得します。次に sortArrayUsingComparator を実行し、キーを obj1 & obj2 として渡しますか? これは紛らわしいです。obj1 と obj2 は [self.orderItems allKeys] 配列の単なるキーですか?

次に、これら 2 つのオブジェクトを取得し、それぞれを別の IDOItem に割り当てます。それから私は実際にアイテム1と2を返しますか?これがまたややこしい。NSArray *キーを入力していると思いました。なぜ私は2つのものを返すのですか?

シナリオ 3

// 3 - Enumerate items and add item name and quantity to description
[keys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    IODItem* item = (IODItem*)obj;
    NSNumber* quantity = (NSNumber*)[self.orderItems objectForKey:item];
    [orderDescription appendFormat:@"%@ x%@\n", item.name, quantity];
}];

キー配列 (実際にはシナリオ 2 から取得) を列挙し、キー obj を使用して IODItem アイテムに割り当てます。しかし、ここで迷子になりました... objectForKey アイテムを取り、それを数量として使用しますか? objectForKey がそのキーとペアになっているオブジェクトを返し、キー "item" が id obj を参照する場合、その id obj は並べ替えられたキー配列からのキーです。つまり、値ではなくキーです。ではない?

4

1 に答える 1