[解決済み】ブロック宣言の構文リスト
質問
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)
まるで言語機能のようですね。
関連
-
[解決済み】Xcodeのビルド失敗 "アーキテクチャx86_64の未定義シンボル"
-
[解決済み] iPhoneでObjective-Cはガベージコレクタを搭載しているのか?
-
[解決済み] Objective-Cで乱数を発生させる
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] NSStringをNSNumberに変換する方法
-
[解決済み] ブロック内の変数をブロック外の変数に代入する
-
[解決済み] カプセル化された匿名関数の構文について説明します。
-
[解決済み】コンパイルの警告:アーキテクチャi386のファイルを処理するルールがない
-
[解決済み] Objective-C パラメータとしてブロックを渡す
-
[解決済み] ObjectiveCの変数位置の宣言・定義?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] イニシャライザーの要素がコンパイル時定数でない
-
[解決済み] 警告 : フォーマット文字列は文字列リテラルではありません (安全でない可能性があります)
-
[解決済み] デバイス用にコンパイルするとApple Mach-Oのリンカーエラーが発生する。
-
[解決済み] NSStringにパーセント記号を追加する方法
-
[解決済み] Xcode 4でNSZombieEnabledを設定するにはどうすればよいですか?
-
[解決済み] Objective-CでNSArrayを逆引きするにはどうしたらいいですか?
-
[解決済み】Objective-Cのコードをユニットテストするのに最適な方法は何ですか?
-
[解決済み】Objective-Cのブロックをプロパティとして使用することはできますか?
-
[解決済み】isEqual:とハッシュをオーバーライドするためのベストプラクティス
-
[解決済み】このブロックで自己を強く捉えると、リテインサイクルになりそうです。