-1

这是代码:

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

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

谢谢。

4

2 回答 2

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)];
于 2012-12-06T11:22:49.530 回答
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];
于 2012-12-07T00:36:51.670 回答