LoginSignup
0
0

More than 3 years have passed since last update.

ブロック構文がいつまでたってもわからない

Last updated at Posted at 2020-05-01

泣きそう……。合ってんのかわからない。

具体例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)が後ろに来てしまう。それを念頭に見比べてみると、引数に取る場合の記法は、通常の記法から、ちょうどブロック名だけを後ろに追いやった形に見える!!つまり、(^)の解釈は、後ろに書いてあるブロック名が省かれたもの、ということでよいのかな……?

下の例では、そもそもブロック名が省略されているので、この書き方になる、と考えるとよいのだろうか??

*1:Objective-Cのブロックの書き方一覧 - Qiita

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0