1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

目次

1.Delegateとは?
2.実例
3.おわりに

1. Delegateとは?

Swiftを勉強していると、初期段階でつまずくのがDelegate
日本語で言うと委譲委ねるです。
近年の、オブジェクト指向プログラミングでは、1クラス1機能に特化したクラス設計を行うことが多いです。いわばその機能の専門家クラスを作って、使いたいところで呼べば良いよね?という思想です。
Swiftも同様に、他のクラスへ処理を委譲(専門家に処理を任せる)して実装させることが多いです。
そんな時に便利なのがDelegateです。

2. 実例

コードを見ていきます。

コード

MainClass.swift
protocol mainDelegate {
    func printIntro()
}

class MainClass {
    var delegate: mainDelegate?
    
    func introduce() {
        delegate?.printIntro()
    }
}
Name.swift
class Name: mainDelegate {
    let name = "田中圭"
    func printIntro() {
        print("名前は\(name)です。")
    }
}
Job.swift
class Job: mainDelegate {
    let job = "俳優"
    func printIntro() {
        print("職業は\(job)です。")
    }
}
Hobby.swift
class Hobby: mainDelegate {
    let hobby = "スキューバダイビング"
    func printIntro() {
        print("趣味は\(hobby)です。月に1回はいきます。")
    }
}

Delegateを使用してそれぞれの専門家に処理をお願いしています。
名前を言いたい時は名前を出力する専門家である、Nameクラス、
趣味を言いたい時はその専門家であるHobbyクラスといった具合です。
もしこれらの機能を一気にメインクラスに持たせたいのであれば、クラスの継承を行います。
:::note info
Delegateを使うと、「呼び出し元の関数がスッキリ書ける」、「処理の記述を分散させることができる」というメリットを教授できます!
:::
playground用にまとめました。

ForPlayground.swift
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/

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?