Swiftにおけるデリゲート (delegate)の使い方とは【初心者向け】
プログラミング初心者向けにSwiftで書くdelegate(デリゲート)の使い方を解説しています。UIKitでよく利用されるデリゲートの使い方などを実際にコードを書きながら説明しているので、理解しやすいでしょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
Swiftで書くdelegateの使い方を解説します。
効率よくプログラミングをするためにもデリゲートとは何なのか、デリゲートの使い方を知っておくと良いでしょう。
なお本記事は、TechAcademyのiPhoneアプリ開発オンラインブートキャンプの内容をもとに紹介しています。
デリゲート (Delegate) とは
デリゲートは「委譲」を意味する言葉で、iOS アプリを swift でプログラミングする際に、よく利用されるプログラム様式 (パターン) のひとつです。
「委譲」、つまり、あるオブジェクトの状態や設定を、そのオブジェクトが決めるのではなく、他のオブジェクトに決定してもらうような形で動作する、ということになります。
実際のイメージとしては「ある特定の事項について、問い合わせ先を指定する」操作と覚えておくと分かりやすいです。
デリゲートとプロトコル
デリゲートとほぼ対になって言及される swift の機能に、「プロトコル」があります。プロトコルはクラス・構造体・列挙型の「仕様書」と呼べるものだと説明しました。
問い合わせ先に対して、どのようなプロパティやメソッドを使って問い合わせを行うかという「取り決め」をプロトコルを使って定義します。
UIKit でよく利用されるデリゲート
UIKit では画面上に表示される情報をビューという形で置いていきます。この際、
- どのような情報をビューとして置くか
- ビューに対してユーザがアクションしたときにどんな処理を行うか
など機能ごとに分割して考えると、効率よくプログラミングすることができます。
この考え方はデリゲートのパターンにも通じるものがあり、実際、UIKit ではデリゲートの仕組みを利用したクラスが頻出します。
UITableView のデリゲート
デリゲートを利用した UIKit の代表的なクラスのひとつに UITableView があります。
UITableView には…
- テーブルに表示されるデータを定義する dataSource という問い合わせ先
- 主にテーブルに対するユーザのアクション処理を定義する delegate という問い合わせ先
の二つのデリゲートが用意されています。
UIViewController のサブクラスである ViewController があるとします。
class ViewController : UIViewController { }
これを UITableView の問い合わせ先として利用できるようにするためには、 UITableViewDataSource / UITableViewDelegate にそれぞれ適合する必要があります。
class ViewController : UIViewController, UITableViewDataSource, UITableViewDelegate { }
UITableViewDataSource には、必須メソッドがあるので、これらを必ず実装する必要があります。
class ViewController : UIViewController, UITableViewDataSource, UITableViewDelegate { override func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int { // セルは何個必要? return 0 // 表示する必要のあるセルの個数を返す } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // どんなセルが必要? return UITableViewCell() // 表示するセルのオブジェクト (インスタンス) を返す } }
その他のデリゲートメソッドは、必要に応じて追加していきます。
以下のサンプルコードのように viewDidLoad などで、デリゲートをアサインすることを忘れずに行います (あるいは storyboard でもデリゲートを設定することができます)。
class ViewController : UIViewController, UITableViewDataSource, UITableViewDelagate { override func viewDidLoad() { super.viewDidLoad() tableView.dataSource = self // tableView の dataSource 問い合わせ先を self に tableView.delegate = self // tableView の delegate 問い合わせ先を self に // ... 省略 ... } override func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int { // セルは何個必要? return 0 // 表示する必要のあるセルの個数を返す } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // どんなセルが必要? return UITableViewCell() // 表示するセルのオブジェクト (インスタンス) を返す } }
以上、Swiftのデリゲート(delegate)について解説しました。
iOSアプリを作る現場で役に立つ知識なので、ぜひ覚えておきましょう。
また、TechAcademyでは初心者でもオリジナルアプリが作れるiPhoneアプリ開発オンラインブートキャンプを開催しています。
期間中は現役エンジニアのメンターが毎日学習をサポートするので、独学よりも効率的に学ぶことができます。