デリゲートの利用
デリゲートとは、簡単に言うと他のオブジェクトから利用されるメソッドのことです。Swiftでは、Objective-Cと同様に特定のUI部品のデリゲートのためのクラスが存在し、UI部品に応じてコールバック的にデリゲートのメソッドを利用することができます。
デリゲートを実装する
デリゲートのメソッドは、インターフェース的に他のオブジェクトから利用されるメソッドが定義されているだけです。そのため、デリゲートについてはメソッドの集合という意味で一般的なクラスとは別にプロトコルという名称で呼ばれます。
デリゲートを利用する場合は、最初にデリゲートのプロトコルをビューコントローラーで実装します(①)。画面に配置するUI部品のオブジェクトのdelegateプロパティでデリゲートを実装したビューコントローラーを指定します(②)。その後、利用したいデリゲートのメソッドをビューコントローラー内に記述します(③)。アプリ起動後、UI部品の動作に応じて記述したメソッド内の処理が行われます(④)。
以上のことを図で整理すると次のようになります。
デリゲートの仕組みは、Swiftと言語の仕組みが似ているスクリプト言語の中ではほとんど見られません。iOSアプリではすべてのフレームワークで共通する仕組で、一度覚えると非常に便利です。
デリゲートを使ってUI部品の動作時の処理を行う
デリゲートのメソッドでは、あらかじめ想定されたUI部品の動作に応じたメソッドが細かく用意されています。addTarget(_:action:forControlEvents:)メソッドでは、UI部品で発生するイベントを指定しなければなりませんが、delegateの場合はメソッド自体がイベントごとに分かれていて開発者自身がイベントを指定する必要はありません。また、メソッドによっては操作が行われたUI部品以外に、操作が発生した位置等の情報が引数で渡されることもあり、この点でもaddTarget(_:action:forControlEvents:)メソッドより便利なことも多いです。
スクロールビューを操作した際の処理を指定できるUIScrollViewDelegateプロトコルを例に、デリゲートの使い方を記します。
// ビューコントローラーでUIScrollViewDelegateプロトコルを実装 class ScrollViewController: UIViewController, UIScrollViewDelegate { // InterfaceBuilderでスクロールビューを配置 @IBOutlet var scroll: UIScrollView! override func viewDidLoad() { super.viewDidLoad() // delegateプロパティで実装したデリゲートを指定 scroll.delegate = self; // スクロールする内部のサイズを指定 scroll.contentSize = CGSizeMake(scroll.frame.size.width, scroll.frame.size.height*2) } // デリゲートのメソッドを記述 // スクロール開始時にスクロールビューの色を青に func scrollViewWillBeginDragging(scrollView: UIScrollView) { scroll.backgroundColor = UIColor.blueColor() } // スクロール終了時にスクロールビューの色を赤に func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) { scroll.backgroundColor = UIColor.redColor() }
ビューコントローラーでUIScrollViewDelegateプロトコルを実装し、スクロールビューのdelegateプロパティでプロトコルの実装先を指定することで動作時の処理を行うことができます。開発者が記述するのはデリゲートのメソッドの中だけでよく、短いコードで的確にUI部品の処理を行うことが可能です。