GWのおかげでたっぷり時間が取れてます。いまのうちにちょっとしたアイデアをメモ的にコーディングできるくらいにはなっておきたいところ。
今日は昨日頭を悩ましていたデレゲートとプロトコルについて整理がついてきました。プロトコルは従うって言うよりは、実装するという感じでしょうか。JavaでいうInterface相当のものらしいです。なにぶんJavaを知らないのでどういうものかはわかりませんが、今日わたしが至った解釈だとInterfaceという言葉の方がイメージに合いそうです。例えば、UIApplicationDelegateに準拠させると、「このクラスはUIApplicationDelegateで規定されているインターフェイスを実装しますよ」という意味合いの模様。ほかにもUIWebViewDelegate、UIImagePickerControllerDelegate、ABPeopePickerNavigationControllerDelegateなどがあけれども、それらに”準拠する”とは、それぞれに従ったインターフェイス(あえてカタカナ)を実装するという意味なわけです。
さて、ここまでの時点でプロトコルについて書いたのに、やたらに目につくのが"Delegate"(デレゲート)という文字列。"~~Delegate"というプロトコルがたくさんあるようです。それらに準拠する(それらに従ったインターフェイスを実装する)ということはどういうことか。"Delegate"=”(権限など)を移譲する”という単語の意味と併せて考えて、今日わたしが至った解釈は「ある機能(WebViewだったり、AddressBook、Accelerometer)にアクセスする権限をクラスに移譲してあげるから、そのかわりにクラスをプロトコルに従わせなさい。」という解釈です。クラスの宣言で
@interface AppDelegate : NSObject <UIApplicationDelegate>
{
}
@end
みたいにして"<>"でDelegateプロトコルに準拠しているのは、ある機能を使う資格を与えてるということですね。
ただ実際のところ、従うと言っても必ず実装しなければならないインターフェイス(required)は少ない(ほとんどoptional)ようで、むしろ、"~~Delegate"プロトコルに従うことで実装できるようになる(アクセスできるようになる)機能が増えるみたいです。例えば、プロジェクトを新規作成するとできるxxxxAppDelegate.hはデフォルトでApplicationDelegateに従っていますが、これに従うことでアプリケーションの起動時の動作をapplicationDidFinishLaunchingメソッドに実装したりできる。ほかにもAudioだとか加速度センサーだとか、それぞれを扱う時にDelegateとする(Delegateプロトコルに従う)とことでエラー処理や起動/終了時の処理が扱えるようになるようです。
ずいぶんすっきりしました。
まだ間違っている部分もあるかもしれませんが、大きな進歩な気がします。
TableViewに挑戦だー。
ピンバック: アプリ開発雑記[1] - macj's Log