【Swift入門】難解なデリゲート(delegate)の使い方を理解しよう!

こんにちは!フリーエンジニアのせきです。

Swiftでアプリ開発をしていると、delegate(デリゲート)という言葉がよく出てきます。

しかし、delegateはなかなかわかりづらく、なんとなく使っているという方も多いと思います。

この記事では、

・delegateとは何か知りたい
・delegateの使い方を知りたい

という基本的な内容から、

・delegateを使うメリットを知りたい

といった応用的な内容に関しても解説していきます。

今回はそんなdelegateについてわかりやすく解説します!

※この記事ではSwift3.1を使用しています。

目次

delegateとは

delegateとは、デザインパターンのひとつです。

Swiftはオブジェクト指向型言語です。

オブジェクト指向型言語は、クラスを定義し、そのクラスを実体化したオブジェクト同士を相互作用させ、動作させます。

オブジェクト指向のメリットは、一度クラスを定義しておけば、他のアプリケーションでも再利用することができるという点です。

では、どのように設計したら再利用性の高いクラスができるのでしょうか?

そのいくつかの方法を示したのが、デザインパターンです。

delegateは英語で「人に任せる」という意味を持っており、「あるクラスから他のクラスに処理を任せる」というデザインパターンです。

このデザインパターンを使うと、処理の流れは決まっているけれど、条件などによって処理内容を変えたい、ということが簡単に実現することができます。

delegateを使った実装方法

delegateを実装するには、3つの役割が必要になります。

1.プロトコル
任せる処理をメソッドとして定義します。このメソッドはデリゲートメソッドと呼ばれます。

2.処理を任せるクラス
デリゲートメソッドを使用し、処理の流れを記述します。

3.処理を任されるクラス
プロトコルで定義されたデリゲートメソッドを実装します。

ここでは、ボタンを押したときに、音を鳴らし、背景を変える、というサンプルを作成し解説していきます。

プロトコルの実装

プロトコルでは「音を鳴らす」「背景を変える」の2つのメソッドを定義します。

定義のみで処理はありません

protocol ButtonDelegate {
	// 音を鳴らす
	func audio()
	// 背景を変える
	func background()
}

処理を任せる側の実装

clickメソッドでデリゲートメソッドを実行します。

class Button {
	var delegate: ButtonDelegate? = nil
	func click() {
		print("ボタンが押されました")
		if let dg = self.delegate {
			dg.audio()
			dg.background()
		} else {
			print("何もしません")
		}
	}
}

変数delegateには実行する時にプロトコルを実装したクラスのインスタンスを設定します。

clickメソッドでは、delegateのnilチェックを行い、nilでなければデリゲートメソッドを実行します。

処理を任される側の実装

デリゲートメソッドを実装します。

class Button1: ButtonDelegate {
	func audio() {
		print("音1を鳴らします")
	}
	func background() {
		print("背景1を表示します")
	}
}

実行

Buttonクラスに、どのクラスに処理を任せるかを宣言します。

let button = Button()

let button1 = Button1()
button.delegate = button1
button.click()

「button.delegate = button1」でButton1クラスのインスタンスに処理を任せる宣言をしているので、実行すると以下のようになります。

実行結果:

ボタンが押されました
音1を鳴らします
背景1を表示します

Button1クラスで実装した処理が実行されます。

delegateを使うメリットとは?

delegateを使うメリットは、処理を任せる側は実際に処理をするのはどのクラスなのか、どんな処理をするのか、ということを意識しなくていい点です。

上の例で、ボタンを押したときに違う処理がしたいのであれば、処理を任されるクラスだけを新しく作ればいいのです。

class Button2: ButtonDelegate {
	func audio() {
		print("音2を鳴らします")
	}
	func background() {
		print("背景2を表示します")
	}
}

そして、実行時に新しく作ったクラスのインスタンスに処理を任せるように宣言します。

let button = Button()

let button2 = Button2()
button.delegate = button2
button.click()

実行結果:

ボタンが押されました
音2を鳴らします
背景2を表示します

プロトコルや処理を任せる側のクラスはそのまま再利用し、まったく異なる処理を行うことができます。

まとめ

今回はdelegateの使い方について解説しました。

デザインパターンを使うことで誰が見てもわかりやすく、使いやすいプログラムを作ることができます。

どう使うか難しいdelegateですが、ぜひdeleateのメリットを理解し使いこなしてください。

deleateの使い方を忘れてしまったら、この記事を思い出して下さい!

この記事を書いた人

フリーランスでWebシステム開発やゲーム開発をしています。
読者の方にプログラミングの面白さをお伝えしたいです。

目次