ブロック宣言構文リスト


277

Objective Cのブロック構文(そして確かにCだと思います)は、よく知られていないことで有名です。ブロックを引数として渡すことは、ブロックをivarとして宣言typedefすることとは異なります。これは、ingブロックとは異なります。

クイックリファレンスとして手元に置いておくことができるブロック宣言構文の包括的なリストはありますか?


9
ブロックプログラミングトピックガイドの「ブロックの宣言と作成」の何が問題になっていますか?
jscs

ブロックプロパティの使用に関する簡単な説明:stackoverflow.com/a/20760583/294884
Fattie

回答:


696

ブロック宣言構文のリスト

ずっと、

  • 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での保持サイクルはありません。

__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)

言語機能のようなものです。


1
@pcperini素晴らしいリストです!そして、typedefされたブロック定義を変数宣言で使用する方法(リストの最初の項目)?論理BlockType ^blockVar = Anonymous Blockは構文エラーを示しますが、^もありません:(
esp

14
どういうわけか、私の脳は、ブロック宣言のためのこれらのさまざまな構文をすべて覚えることができません。私はおそらくこの答えを週に一度見ます。私はあなたにこれに10の賛成票を与えることができればいいのに。
ベン・バロン

36
このような答えを得るには、StackOverflowの殿堂が必要です。
bejonbee 2013

1
これを印刷用のビューアで使用できるようにMarkdownに変換しました。ハンディ!gist.github.com/swizzlr/6268955
Swizzlr

20
これは入れ墨として必要だと思います。
Isaac Overacker 2013年

83

私は個人的にこのウェブサイト(http://fuckingblocksyntax.com)を使用するのが好きです。名前はブロック構文自体より覚えやすいです:

http://fuckingblocksyntax.com

また、不適切な単語が含まれているURLを読み込めない場合は、次のミラーを使用できます。http://goshdarnblocksyntax.com

fuckingblocksyntaxのWebサイト


1
ウェブサイトの完璧な名前..:D
Vineeth

39

Typedef:

typedef void (^block)(NSString *arg);

列をなして:

void (^block)(NSString *) = ^(NSString *param) {
  // do something....
};

方法:

- (void)method:(void (^)(NSString *param))handler

この答えは、結局それほど複雑ではないことを示しています...混合して一致させる3つの異なる構文だけです。
ジョセフチェン

4
受け入れられた回答は、不必要な膨張を伴うこの回答の単なるコピーです。
Erik Aigner 2014

16

Xcode 4スニペットライブラリには、変数としてブロックのtypedefとインラインブロックのテンプレートが含まれています。また、オートコンプリート(typedefblockおよびinlineblock)を介して使用することもできます。

メソッドの引数としてのブロックの場合は、a typedefを宣言してからそれを使用することをお勧めします。これにより、コードが非常に読みやすくなります。


11

私は、振られた後にサイコロの値を返すクラスのためにcompletionBlockを書きました:

  1. returndefでtypedefを定義します(.h上記の@interface宣言)

    typedef void (^CompleteDiceRolling)(NSInteger diceValue);
  2. @propertyブロックのを定義します(.h

    @property (copy, nonatomic) CompleteDiceRolling completeDiceRolling;
  3. finishBlock.h)でメソッドを定義する

    - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock;
  4. 前の定義されたメソッドInsert .mファイルとコミットfinishBlockする@property前に定義されました

    - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock{
        self.completeDiceRolling = finishBlock;
    }
    
  5. completionBlock定義済みのvariableType をトリガーに渡すには(completionBlock存在するかどうかを確認することを忘れないでください)

    if( self.completeDiceRolling ){
        self.completeDiceRolling(self.dieValue);
    }
    

7
typedef void (^OkBtnBlock)(id data);
typedef void (^CancelBtnBlock)();

@property (nonatomic, strong) OkBtnBlock okBtnBlock;
@property (nonatomic, strong) CancelBtnBlock cancelBtnBlock;

+ (void)foo:(OkBtnBlock)okBtn andCancel:(CancelBtnBlock)btnCancel;

ステップによって全体の処理ステップを記述するために良いだろう、ブロックが...あなたは、IOSを初めて使用する場合は理解しにくいです
アレックス・CIO

3

Xcode 4.2で作業する必要がある場合は、非ブロックプロパティの場合と同じように、プロパティとして宣言されたブロックを@synthesizeすることもできます。ブロック構文があなたを投げさせてはいけません。

ブロックプロパティがこれである場合:

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

それからあなたの@synthesizeはこれです:

@property blockName;

乾杯。


こんにちは、再確認してください。私はあなたをフォローしようとしました@property blockNameが、機能しません。あるべきだと思います@synthesize blockName;か?(ブロックの合成用)
jeet.chanchawat

おっと...(間接的に)すでにあなたを待って、それはXcodeの7で仕事を文句を言わないことを述べた
jeet.chanchawat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.