logo header
logo header
logo header
logo header
  • 2014.05.27
  • 技術ブログ

iOS blockの使い方

こんにちは。
なめ橋です。

もうすぐ6月ですね。
先週あたりから、気温もグンと上がってきたので、半そでの人が増えてきました。
でも、夜になるとまだ肌寒いので、気温差で風邪をひかないように気を付けましょう。

blockの主な使い方

前回に引き続き、今回もblockに関する説明です。
前回はblockに関する基本的な宣言方法や使用方法等を説明しましたが、今回はより具体的なblockの使用方法について説明したいと思います。

メソッドの引数

まずは、blockをメソッドの引数にする場合の使用方法に関して説明します。

基本型での引数

最初は、基本型のblock構文をメソッドの引数とした場合です。
軽く復習すると、基本型はこのような形式を指します。

メソッドの宣言方法は通常の宣言方法と変わりません。型名宣言をする箇所にblock文を定義します。

ポイントとしては、blockの名前を省略する箇所です。
基本型のblockを引数とする際は、blockの名前を省略し、"^"(ハット)のみとなります。

それでは、メソッドの処理を記述していきます。
今回は、文字列と、block内で処理した整数を結合し、文字列として返す処理を行います。

5行目では、呼び出し元で定義するblockFunkの戻り値をprocessingIntegerに格納しています。
blockの戻り値をint型にしているため、問題ないとは思われますが、block内ではint型の変数を返す必要があります。
次に上記で定義したメソッドの呼び出し方法です。

メソッドの呼び出しは通常通り、"[]"を使用して呼び出します。
Xcodeには自動補完機能があるため、特に困ることはないかと思います。
上記のコードでは、結果的に「結合結果:50」というログが出力されます。

typedef型での引数

次にtypedef型で宣言したblockをメソッドの引数として扱う方法についてです。
まずは、blockを宣言します。宣言方法は前回説明したので、今回詳しい説明は省略します。
以下を.hファイルに宣言します。

次にメソッドを定義します。
メソッドの宣言方法は先ほどの基本型よりも簡単で、型名宣言をする箇所にblock名を書くだけです。
今回もblockで処理した内容と文字列を結合します。

最後にメソッドの呼び出しを行います。

上記のコードでは、結果的に「結合結果 = 10」というログが出力されます。
以上がblockをメソッドの引数として利用する方法になります。

スコープ外の値

blockではスコープ外の値を参照することも可能です。
参照したい変数の宣言元で、"__block"という修飾子を使えばスコープ外のローカル変数を参照可能です。
先ほどのtypedef型でのメソッドを用いると以下のような形になります。

上記のコードでは、7行目の参照箇所でビルドエラーとなるため、"__block"修飾子が無いスコープ外の変数はblock内で参照できないことが確認できます。

まとめ

如何でしたか?
block構文は最初呼び出しの順序などで混乱することがあると思います。(僕もかなり混乱しました)
ただ、一旦理解してしまうと、delegateなどを使うことなくコールバックメソッドを呼び出せることができるので、非常に便利です。
また、以前説明した、カテゴリ機能と組み合わせることで、コード管理が簡単になります。
是非試してみてください。

ともに世界をアップグレードできる、そんな日を夢見て。
Upgrade the World!