Swiftで遊ぼう! - 736 - ハンドラと言われて納得できるようになりました
CoreMotionの実装をしているところです。
managerインスタンスを使って、測定間隔を設定してハンドラを起動させます。
「ハンドラ(Handler)」って何なんでしょう? ハンドラという概念はプログラミング初心者に難しいかもしれません。
ネットで調べればこんな文言が出てきます。
ハンドラとは、扱う人、調教師、訓練士などの意味を持つ英単語。何らかの処理要求が発生したときに起動されるプログラムなどのこと。
ハンドラはプログラム中で関数やサブルーチンなどの形で実装され、メモリ上に展開されるが、通常のプログラムの流れには組み込まれず、普段は待機している。そのハンドラが対応すべき処理要求が発生するとプログラムの流れを中断してハンドラが呼び出され、要求された処理を実行する。対応付けられた事象の種類により「イベントハンドラ」「割り込みハンドラ」などの種類がある。
この説明を読んでSwiftプログラマーなら直ぐ「クロージャだ!」ってピーンときます。私もそうです(^^)/
CoreMotionライブラの中に「CMAccelerometerHandler」というハンドラがあります。これはクロージャです。クロージャは名前の無い関数の事ですが使用する時に不便なんです。ということで便宜的に「typealias」を使って名前をつけるんです。納得!
このコードブロック(ハンドラ)は次のように2つの引数を受けて、何も返さないクロージャです。
(CMAccelerometerData?, NSError?) -> Void
まずハンドラを作ります。
let accelerometerHandler: CMAccelerometerHandler = { ... // ここでクロージャーを実装させる。
ここからクロージャを実装するステップです。ここで色々(バリエーション)なパターンがあります。クロージャには強力な推論機能が備わっているのでかなり省略することができます。まず、チュートリアルに書かれているコードを見ます。
[weak self] (data: CMAccelerometerData?, error: NSError?) -> Void in ...
「in」はクロージャのキーワードなんで「in」以下を実行するということです。
このチュートリアルのコードですが、私はこの書き方が気に入りません。まず「[weak self]」です。こうしてやると、クロージャ内で使う「self」はstrongからweakに変更されるのですが、覚えていないとクロージャ内の「self」がstrongなんじゃないかと勘違いしてしまうような気がします。「self」が明示的にweakに変化したことが分かるコードを私は好むので「[weak weakSelf = self]」にしたいです。
更に「-> Void」は必要の無いコードです。書いていなければ戻り値は存在しないことが明白なので必要の無いコードは書かない方がシンプルです。したがって私は次のように書きます。
[weak weakSelf=self] (data: CMAccelerometerData?, error: NSError?) in ...
ただのコーディングスタイルの話でした。
今日はこれだけ。