ブロックは、関数のような実行可能なものであり、基本的には、保存、受け渡し、後で実行できる (または実行できない) コードの一部です。に整数を渡したい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];