以下是代码:
TrailLayer * layer = (TrailLayer*)[_layers objectAtIndex:(int)^{
if (_segmentNumber < [_segmentArray count]) {
return _segmentNumber;
} else {
return _segmentNumber - 1;
}
}];
这里有什么问题?这里,所有_Variables都是IVAR。我是第一次使用Blocks,有人可以帮我识别这个问题。它在这里给出了EXC_BAD_INSTRUCTION。
感谢。
答案 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];