Help us understand the problem. What is going on with this article?

【プログラミング初心者】Swift基礎~デリゲート~

はじめに

今回はデリゲートと呼ばれるプログラミングの手法について紹介します。
プロトコルを使った実装になるのでプロトコルがわからない方はこちらをまず参照してください。

デリゲートはiOSアプリでよく出てきます。
例えばUITableViewUICollectionViewなどです。
よく出るがゆえに避けては通れないので内部ではどんな実装になっているのか想像できるようにはしておきたいですね。

デリゲート(Delegate)

デリゲートとは

デリゲートはSwiftの文法ではなく、プログラミングの手法の1つです。
つまり、こんな感じでクラスを作ると便利ですよというようなクラス作成のパターンです。
このようなパターンのことをデザインパターンなどと言ったりします。

デリゲート(Delegate)には「委譲する」、「任せる」というがあります。
あるオブジェクトの処理を他のオブジェクトに任せる目的で使います。

デリゲートには「処理を任せる」オブジェクトと「処理を任される」オブジェクトが出てきます。

「処理を任せる」オブジェクトにボタンがあったとします。
そのボタンをタップしたとき何らかの処理を行ないますが、その具体的な処理は「処理を任される」オブジェクトに任せるます。
「処理を任される」オブジェクトから見るとボタンが押されたとき「処理を任せる」オブジェクトからボタンが押されたという通知が来るようなイメージです。

言葉で説明するとこんな感じの手法ですが、実際の実装方法を見たほうがわかるかもしれません。
とはいっても以前説明したプロトコルを使った実装例とあまり実装の違いはありません。

デリゲートの実装

あるボタンクラスがあり、そのボタンが押されたら何かしらの処理をするというように実装していきます。

デリゲートを定義する

デリゲートはプロトコルで定義します。

ButtonDelegate.swift
protocol ButtonDelegate {
    func didTapBotton()
}

ボタンオブジェクトがタップされたらdidTapBotton()が呼び出されるという想定です。
デリゲートには委譲する処理を定義していきます。

「処理を任せる」オブジェクトを作成する

今回の場合ボタンクラスが「処理を任せる」オブジェクトになります。
以下のような実装となります。

Button.swift
class Button {
    var delegate: ButtonDelegate? = nil

    func onTapButton() {
        print("ボタンがタップされました")
        print("処理を委譲します")

        delegate?.didTapBotton()
    }
}

ボタンが押されるとonTapButton()が実行されるとします。
onTapButton()で何らかの処理を行った後ButtonDelegatedidTapBotton()を呼び出します。
これで委譲する準備は完了です。

ButtonDelegateはプロトコルなので具体的なクラスは気にしません。
とりあえずボタンが押されたらdidTapBotton()を呼び出してあげるから、あとは好きな処理をしといてー
というようなイメージです。

「処理を任される」オブジェクトを実装する

「処理を任される」オブジェクトは画面クラスやその他テキトーなクラスなど何でも構いません。
ButtonDelegateを継承しているだけでいいのです。

Hoge.swift
class Hoge: ButtonDelegate {
    func didTapBotton() {
        print("Hogeに処理が委譲されました")
    }
}

委譲されるクラスの実装はこれだけです。
ボタンがタップされたらdidTapBotton()が呼び出されるのでここに好きな処理を書きます。

実行する

これでデリゲートの実装ができました。
それでは実際に使ってみましょう。

let button = Button()
let hoge = Hoge()

button.delegate = hoge // delegateに委譲先のオブジェクトをセットする

button.onTapButton() // ボタンがタップされたと想定
実行結果
ボタンがタップされました
処理を委譲します
Hogeに処理が委譲されました

button.delegate = hogeで委譲元オブジェクトのデリゲートに委譲先オブジェクトを設定し紐付けしています。

このようにしてデリゲートで処理を委譲します。

最後に

今回はデリゲートの実装方法を紹介しました。
基本的にプロトコルの実装とあまり変わらないのではないでしょうか?

冒頭で言ったようにiOSではUICollectionViewなどでよくデリゲートが使われています。
(DataSourceもありますがこれもデリゲートと似たようなものです)

UICollectionViewのデリゲートはよく画面クラスで継承しますが、内部ではこのようにして処理を通知するような実装がされています。

自分で実装するのはまだ難しいかも知れませんが内部の処理を想像できる程度に理解できていればいいかなと思います。

今回の内容は以上です。
本記事とは別でプログラミング未経験からiOSアプリ開発が行えるようになることを目的とした記事を連載しています。
連載は以下にまとめていますのでそちらも是非もご覧ください。
http://naoyalog.com/

euJcIKfcqwnzDui
フリーランスエンジニア。主にiOSアプリ開発を行う。 現在はReactNativeでiOS/Androidアプリを開発中。 Swift/Objective-Cネイティブ開発 VIPER、MVP、Redux ご連絡はTwitterのDMからお願いします。 本ブログに記述された見解は私個人の見解であり、所属する会社&組織の見解を反映したものではありませんのでご了承ください。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした