我试图解释这个区块代码:
情景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 *键。然后调用isEqualToString和比较器==一样返回BOOL。这对我来说很有意义,因为该块是返回类型BOOL。那么如何填充索引的NSIndex集?
情景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];
}];
所以我再次为那本词典得到了所有的凯斯。然后我sortArrayUsingComparator并将密钥传递给obj1& obj2的?这令人困惑。 obj1& obj2只是[self.orderItems allKeys] -array中的键?
然后我拿走那些2个obj并将每个obj分配给不同的IDOItem。然后我实际上返回items1& 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];
}];
我枚举通过keys数组(实际上是从SCENARIO 2获得)并使用密钥obj并将其分配给IODItem项。但这里是我迷路的地方......我把objectForKey项目用作数量?如果objectForKey返回与该键配对的对象,并且键“item”指的是id obj,则该id obj是来自排序键数组的键。所以它是关键,而不是价值!不是吗?
答案 0 :(得分:1)
如果您将块视为带参数和返回类型的方法,那就不会太混乱。第一种方法是迭代整个键集并确定它们是否通过了您创建的测试。如果您的区块返回' YES'然后将它添加到新索引集中。如果该块返回“否”'然后它被忽略了。生成的索引集将引用通过测试的一组完整的键。
第二种方法是一种在数组上执行自定义排序的方法。根据哪个对象应该更接近数组的开头,您可以返回NSOrderedAscending,NSOrderedSame或NSOrderedDescending。这可能会根据您对排序的标准而改变。您基本上完成的操作在第一个对象的名称上被称为compare:
方法'属性。根据这是什么数据类型(我假设它是一个NSString),你的块将从NSString调用compare:
方法。如果它是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];
}];