使用Block与NSArray的objectAtIndex方法

时间:2012-12-06 11:01:20

标签: iphone objective-c ios xcode objective-c-blocks

以下是代码:

TrailLayer * layer = (TrailLayer*)[_layers objectAtIndex:(int)^{
    if (_segmentNumber < [_segmentArray count]) {
        return _segmentNumber;
    } else {
        return _segmentNumber - 1;
    }
}];

这里有什么问题?这里,所有_Variables都是IVAR。我是第一次使用Blocks,有人可以帮我识别这个问题。它在这里给出了EXC_BAD_INSTRUCTION。

感谢。

2 个答案:

答案 0 :(得分:2)

尝试此代码,首先写入块以获取index号码,然后使用该号码从array

中检索值
int (^segmentIndex)(int) = ^(int segmentNumber){
        if (segmentNumber < [_layers count]) {
            return segmentNumber;
        } else {
            return segmentNumber - 1;
        }
};


NSLog(@"Trail Layer %@", [_layers objectAtIndex:segmentIndex(_segmentNumber)]);
TrailLayer * layer = (TrailLayer*)[_layers objectAtIndex:segmentIndex(_segmentNumber)];

答案 1 :(得分:1)

块是一个像函数一样的可运行的东西,基本上是一段代码,你可以存储,传递,以及稍后运行(或不运行)。你想把一个整数传递给objectAtIndex:,所以传递一个块绝对没有任何意义。

您可能要做的是运行该块,然后将其结果传递给objectAtIndex:。在这种情况下,您必须运行块:

TrailLayer * layer = [_layers objectAtIndex:^{
    if (_segmentNumber < [_segmentArray count]) {
        return _segmentNumber;
    } else {
        return _segmentNumber - 1;
    }
}()]; // <-- run the block

然而,定义一个块(它是一个完整的对象,并做很多花哨的东西)只是立即运行它是有点傻。如果您只想使用一段代码作为表达式,可以使用GCC和LLVM支持的“语句表达式”语言扩展:

TrailLayer * layer = [_layers objectAtIndex:({
    int result;
    if (_segmentNumber < [_segmentArray count]) {
        result = _segmentNumber;
    } else {
        result = _segmentNumber - 1;
    }
    result;
})];

但实际上你应该在这种情况下做一个常规的C条件表达式:

TrailLayer * layer = [_layers objectAtIndex:
                      _segmentNumber < [_segmentArray count] ?
                      _segmentNumber : _segmentNumber - 1];