我试图解释这个块代码:
场景 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 是排序后的键数组中的键。所以它是一个键,而不是一个值!不是吗?