泣きそう……。合ってんのかわからない。
具体例1
void (^myFunction)(int) = ^(int i){ printf("%d\n",i); };
このブロックを呼び出すときはこのように書きます。
myFunction(3); // 3
(*1より引用)
具体例1を読む
引かせていただきました……。ともかく具体例を読めるようになりたい。
まず、上のコードの左辺が意味しているのは、
・myFunctionはブロックだよ
・voidを返すよ
・Intを引数に取るよ
ということ。並び順はメソッドの宣言と変わらないので、それほど難しくないはずなのだが、メソッド名にもカッコがついているのが個人的には読みづらい。
右辺が意味しているのは、
・iはintの仮引数だよ
・具体的な処理は{}の中だよ
ということ。なんにせよカッコが多くてわかりづらいが、読めないではないかも。
実際に使ってみた下のコードは特に読みづらい点はない。
具体例2
// 引数にブロックオブジェクト - (void)setBlock:(BOOL (^)(int i, int j))block; // 戻り値の型 (^)(引数リスト)ブロック名
// hogeメソッドの戻り値として"BOOLを戻り値とするブロックオブジェクト"を返す - (BOOL (^)(int, int)) hoge; - // 戻り値の型 (^)(引数リスト)
(*1より引用)
具体例2を読む
再び引用。上のコードが意味しているのは、
・setblockというメソッドの引数にブロックを取るよ
・そのブロックはBOOLを返し、2つの引数をとり、blockという名前で扱うよ
ということ。大きく分けると、(ブロックの情報)ブロック名、という作りになっているが、^がカッコの中に入っているのが不可解。
……と思っていたが、こう並べてみるとうまいこと解釈できなくもない?
// 通常の宣言方法
void (^myFunction)(int)
// ブロックを引数に取る場合
(BOOL (^)(int i, int j))myFunction;
ブロックを引数に取る場合は、ブロック名(この場合ではmyFunction)が後ろに来てしまう。それを念頭に見比べてみると、引数に取る場合の記法は、通常の記法から、ちょうどブロック名だけを後ろに追いやった形に見える!!つまり、(^)の解釈は、後ろに書いてあるブロック名が省かれたもの、ということでよいのかな……?
下の例では、そもそもブロック名が省略されているので、この書き方になる、と考えるとよいのだろうか??