9

我已经看到了一些使用 NSArray indexOfObjectPassingTest 的示例,但我无法让它们工作(它们不会返回有效的索引)。所以现在我正在尝试使用内联块。我通过 typedef'ing 一个块,然后将它设置为一个属性,合成它,并在构造函数中初始化它来完成它。然而,这种方式会使整个点静音,因为我可以轻松地创建一个方法并使用它(更少的打字,更少的努力)。

我想要达到的目标是:

Observations *obs = [self.myAppointment.OBSERVATIONS objectAtIndex: ^NSInteger (NSString *keyword){ 
    for (Observations *obs in self.myAppointment.OBSERVATIONS) {
        if ([obs.TIME isEqualToString:keyword] == YES) return (NSInteger)[self.myAppointment.OBSERVATIONS indexOfObject:obs];
    }
    return (NSInteger)-1;
}];

但是 Xcode 根本就没有它。我尝试了不同的变体,但将其声明为内联似乎是一个问题,这很奇怪,因为正如我所说,对它进行类型定义、声明和综合是这样的:

Observations *obs = [self.myAppointment.OBSERVATIONS objectAtIndex:findObs(keyword)];

findObs 又是一个定义的块,它做同样的事情。这是语法问题,还是我错过了其他更重要的东西?

4

3 回答 3

32

-objectAtIndex:将 anNSUInteger作为参数,但您将其传递给一个块(由 表示^)。您的第二个示例findObs使用参数调用(可能是您的块),将该调用的结果keyword传递给.-objectAtIndex:

您可能想-objectAtIndex:结合-indexOfObjectPassingTest:

NSString *keyword = /* whatever */;
NSArray *array = self.myAppointment.OBSERVATIONS;
NSUInteger idx = [array indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
    Observations *obs = (Observations*)obj;
    return [obs.TIME  isEqualToString:keyword];
}];
if (idx != NSNotFound)
    Observations *obs = [array objectAtIndex:idx];
于 2012-06-11T12:36:00.613 回答
6
于 2015-01-20T05:56:37.230 回答
3

不需要 typedef 或综合任何东西来使您的第二个示例工作 - 只需从方法返回块,它看起来像这样:

-(NSUInteger(^)(NSArray *, NSString *))findObs {
    return ^(NSArray *array, NSString *keyword) {
        for (NSUInteger i = 0; i < [array count]; i++) {
            Observations *obs = [array objectAtIndex:i];
            if ([obs.TIME isEqualToString:keyword]) {
                return i;
            }
        }
        return NSNotFound;
    };
}

Observations *obs = [self.myAppointment.OBSERVATIONS objectAtIndex:[self findObs](keyword)];

以下是将块定义为方法返回值而不是 inline 的一些充分理由

于 2012-06-11T18:04:42.667 回答