MENU

【Swift文法】専門家に処理を依頼するDelegate

目次

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クラスといった具合です。
もしこれらの機能を一気にメインクラスに持たせたいのであれば、クラスの継承を行います。

Delegateを使うと、「呼び出し元の関数がスッキリ書ける」、「処理の記述を分散させることができる」というメリットを教授できます!

playground用のコード

playground用にまとめました。

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/

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Rio@iOSエンジニアのアバター Rio@iOSエンジニア 経営者兼モバイルアプリエンジニア

都内のモバイルアプリ開発会社経営者。
モバイルアプリの新規の請負開発及び保守運用を引き受ける。
Denso→Honda→現在
#RxSwift #MVVM #Firebase #Python3

コメント

コメントする

目次