1. ホーム
  2. オブジェクティブC

[解決済み】ブロック宣言の構文リスト

2022-04-02 10:12:39

質問

Objective Cのブロック構文(というか、Cの構文)は不統一なことで有名です。ブロックを引数として渡すのと、ブロックをivarとして宣言するのとは違って見えますし、ブロックを引数として渡すのと、ブロックをivarとして宣言するのとは違って見えます。 typedef ブロックになります。

ブロック宣言の構文について、手元に置いてすぐに参照できるような包括的なリストはないでしょうか?

どのように解決するのですか?

ブロック宣言の構文一覧

全体を通して

  • return_type には、返したいオブジェクトやプリミティブなどの種類を指定します (一般的には void )
  • blockName 作成するブロックの変数名となります。
  • var_type 引数として渡したいオブジェクトやプリミティブなどの型を指定します(空白のままだとパラメータはありません)。
  • varName 与えられたパラメータの変数名である

そして、好きなだけパラメータを作成できることを忘れないでください。

ブロックを変数にする

おそらく最も一般的な宣言方法です。

return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
    // ...
};

プロパティとしてのブロック

ブロックを変数として宣言するのとよく似ていますが、微妙に異なります。

@property (copy) return_type (^blockName) (var_type);

パラメータとしてのブロック

この例では、ブロック引数を必要とするメソッドを宣言していることになります。

- (void)yourMethod:(return_type (^)(var_type))blockName;

引数としてのブロック

この例では、ブロック引数を必要とするメソッドを匿名ブロックで呼び出しています。ブロック変数をすでに宣言している場合は、変数名を引数として渡せば十分です。

[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
    //...
}];

匿名ブロック

これは機能的には匿名ブロックですが、ブロックを変数に代入する構文は、変数に匿名ブロックと等しい値を設定するだけです。

^return_type (var_type varName)
{
    //...
};

typedef ブロック

これは、ブロックの宣言時に他のクラス名と同様に参照できる短い名前を設定することができます。

typedef return_type (^blockName)(var_type);

その後で blockName を標準のブロック宣言の構文ではなく、単純に置き換えてください。

インラインブロック

これは間違いなく、あまり有用ではないブロックの利用法ですが、それでも利用することはできます。インライン・ブロックは、インスタンス化の直後に呼び出される匿名ブロックである。

^return_type (var_type varName)
{
    //...
}(var);

インラインブロックは、主にスコープオフセットに有効で、中括弧で区切られた単純なコードの塊とほぼ同じです。

{
   //...
}

再帰的ブロック

これにより、ブロックを自分から呼び出すことができ、コールバックやGCDの呼び出し時に使用できるループを作成することができます。このインスタンス化方法は、ARCのretain cyclesから解放されます。

__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
    if (returnCondition)
    {
        blockName = nil;
        return;
    }

    // ...
} copy];
blockName(varValue);

ブロックの返却

メソッドはブロックを返すことができます。

- (return_type(^)(var_type))methodName
{
    // ...
}

は、ちょっと不思議なことに、関数として使用することができます。

return_type (^FunctionName())(var_type)
{
    // ...
}

追記事項

もし見逃しているものがあれば、コメントで教えてください、調査・追加します。

あ、Swiftでは...

blockName = (varName: var_type) -> (return_type)

まるで言語機能のようですね。