块是像函数一样的可运行的东西,基本上是一段可以存储、传递和稍后运行(或不运行)的代码。您想将整数传递给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];