Objective Cのブロック構文(そして確かにCだと思います)は、よく知られていないことで有名です。ブロックを引数として渡すことは、ブロックをivarとして宣言typedef
することとは異なります。これは、ingブロックとは異なります。
クイックリファレンスとして手元に置いておくことができるブロック宣言構文の包括的なリストはありますか?
Objective Cのブロック構文(そして確かにCだと思います)は、よく知られていないことで有名です。ブロックを引数として渡すことは、ブロックをivarとして宣言typedef
することとは異なります。これは、ingブロックとは異なります。
クイックリファレンスとして手元に置いておくことができるブロック宣言構文の包括的なリストはありますか?
回答:
ずっと、
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)
{
// ...
}
何か見逃した場合は、コメントでお知らせください。調査/追加します。
blockName = (varName: var_type) -> (return_type)
言語機能のようなものです。
BlockType ^blockVar = Anonymous Block
は構文エラーを示しますが、^もありません:(
私は個人的にこのウェブサイト(http://fuckingblocksyntax.com)を使用するのが好きです。名前はブロック構文自体より覚えやすいです:
また、不適切な単語が含まれているURLを読み込めない場合は、次のミラーを使用できます。http://goshdarnblocksyntax.com
Typedef:
typedef void (^block)(NSString *arg);
列をなして:
void (^block)(NSString *) = ^(NSString *param) {
// do something....
};
方法:
- (void)method:(void (^)(NSString *param))handler
私は、振られた後にサイコロの値を返すクラスのためにcompletionBlockを書きました:
returndefでtypedefを定義します(.h
上記の@interface
宣言)
typedef void (^CompleteDiceRolling)(NSInteger diceValue);
@property
ブロックのを定義します(.h
)
@property (copy, nonatomic) CompleteDiceRolling completeDiceRolling;
finishBlock
(.h
)でメソッドを定義する
- (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock;
前の定義されたメソッドInsert .m
ファイルとコミットfinishBlock
する@property
前に定義されました
- (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock{
self.completeDiceRolling = finishBlock;
}
completionBlock
定義済みのvariableType をトリガーに渡すには(completionBlock
存在するかどうかを確認することを忘れないでください)
if( self.completeDiceRolling ){
self.completeDiceRolling(self.dieValue);
}
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;
Xcode 4.2で作業する必要がある場合は、非ブロックプロパティの場合と同じように、プロパティとして宣言されたブロックを@synthesizeすることもできます。ブロック構文があなたを投げさせてはいけません。
ブロックプロパティがこれである場合:
@property (copy) return_type (^blockName) (var_type);
それからあなたの@synthesizeはこれです:
@property blockName;
乾杯。
@property blockName
が、機能しません。あるべきだと思います@synthesize blockName;
か?(ブロックの合成用)