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 个 obj 分配给不同的 IDOItem。然后我实际上返回了项目 1 和 2?这再次令人困惑。我以为我正在填写一个 NSArray *keys。为什么我要退回 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];
}];

我通过键数组(实际上是从 SCENARIO 2 获得)枚举并使用键 obj 并将其分配给 IODItem 项。但这是我迷路的地方......我拿了 objectForKey 项目并将其用作数量?如果 objectForKey 返回与该键配对的对象,并且键“item”指的是 id obj,则该 id obj 是排序后的键数组中的键。所以它是一个键,而不是一个值!不是吗?

4

1 回答 1

1

如果您将块视为具有参数和返回类型的方法,这并不太令人困惑。第一种方法只是遍历整个键集并确定它们是否通过了您创建的测试。如果您的块返回“是”,则将其添加到新索引集中。如果块返回“NO”,则将其忽略。生成的索引集将引用通过测试的完整键集。

第二种方法是一种对数组执行自定义排序的方法。根据哪个对象应该更接近数组的开头,您可以返回 NSOrderedAscending、NSOrderedSame 或 NSOrderedDescending。这可能会根据您对排序的标准而改变。您基本上所做的就是compare:在第一个对象的“名称”属性上调用方法。根据这是什么数据类型(我假设它是一个 NSString),您的块compare:将从 NSString 调用该方法。如果它是 NSNumber 或其他类,它将调用该类的compare:方法等。该compare:方法还返回一个 NSComparisonResult(上面列出的三个选项之一)。

新增场景三:

对于通过“键”枚举的场景 3,每个“id obj”都是字典中的键,而不是您编写的 IODItem。要获得适用的 IODItem,您可能需要执行以下操作(我假设self.orderItems指的是 NSDictionary 对象):

__block NSMutableString *orderDescription;
__block NSNumber *quantity;

[keys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
   NSString* currentKey = (NSString*)obj;
   IODItem *item = [self.orderItems objectForKey:currentKey];
   quantity = item.quantity;
   [orderDescription appendFormat:@"%@ x%@\n", item.name, quantity];
}];
于 2013-07-06T04:57:27.257 回答