目次
1. Delegateとは?
Swiftを勉強していると、初期段階でつまずくのがDelegate
。
日本語で言うと委譲
、委ねる
です。
近年の、オブジェクト指向プログラミングでは、1クラス1機能に特化したクラス設計を行うことが多いです。いわばその機能の専門家クラスを作って、使いたいところで呼べば良いよね?という思想です。
Swiftも同様に、他のクラスへ処理を委譲(専門家に処理を任せる)して実装させることが多いです。
そんな時に便利なのがDelegate
です。
2. 実例
コードを見ていきます。
コード
protocol mainDelegate {
func printIntro()
}
class MainClass {
var delegate: mainDelegate?
func introduce() {
delegate?.printIntro()
}
}
class Name: mainDelegate {
let name = "田中圭"
func printIntro() {
print("名前は\(name)です。")
}
}
class Job: mainDelegate {
let job = "俳優"
func printIntro() {
print("職業は\(job)です。")
}
}
class Hobby: mainDelegate {
let hobby = "スキューバダイビング"
func printIntro() {
print("趣味は\(hobby)です。月に1回はいきます。")
}
}
Delegate
を使用してそれぞれの専門家に処理をお願いしています。
名前を言いたい時は名前を出力する専門家である、Nameクラス、
趣味を言いたい時はその専門家であるHobbyクラスといった具合です。
もしこれらの機能を一気にメインクラスに持たせたいのであれば、クラスの継承を行います。
:::note info
Delegateを使うと、「呼び出し元の関数がスッキリ書ける」、「処理の記述を分散させることができる」というメリットを教授できます!
:::
playground用にまとめました。
protocol mainDelegate {
func printIntro()
}
class MainClass {
var delegate: mainDelegate?
// 外部からdelegateを渡し忘れないようにコンストラクタインジェクションを使用
// https://mama-lifestyle.jp/swift-dev-jp/di/
init (delegate: mainDelegate) {
self.delegate = delegate
}
func introduce() {
delegate?.printIntro()
}
}
class Name: mainDelegate {
let name = "田中圭"
func printIntro() {
print("名前は\(name)です。")
}
}
class Job: mainDelegate {
let job = "俳優"
func printIntro() {
print("職業は\(job)です。")
}
}
class Hobby: mainDelegate {
let hobby = "スキューバダイビング"
func printIntro() {
print("趣味は\(hobby)です。月に1回はいきます。")
}
}
// 名前の自己紹介
let mainName: MainClass = .init(delegate: Name())
mainName.printIntro()
// 職業
let mainJob: MainClass = .init(delegate: Job())
mainName.printIntro()
// 趣味
let mainHobby: MainClass = .init(delegate: Hobby())
mainName.printIntro()
名前は田中圭です。
職業は俳優です。
趣味はダイビングです。月に1回はいきます。
3. おわりに
いかがでしたでしょうか?
Delegate
を使用することで、メインのクラスのコードがdelegateの型をプロトコルに決めてあげるだけで、そのデリゲートを変えてあげるだけでさまざまな処理ができるようになります!便利!
※外部から値を渡すプロパティは忘れやすいのでコンストラクタインジェクションを使用
https://mama-lifestyle.jp/swift-dev-jp/di/