此块如何返回工作?

马尔乔科科

我试图解释这个代码:

场景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]数组中的键吗?

然后,我将这两个obj分配给一个不同的IDOItem。然后我实际上退回了items1&2?这再次令人困惑。我以为我正在填写NSArray *键。我为什么要退两件东西?

场景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是来自已排序键数组的键。因此,它是关键,而不是价值!是不是

柔术编码器

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

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

添加方案3:

对于方案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];
}];

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章