LoginSignup
2
3

More than 3 years have passed since last update.

Swift よくつまずくdelegateについて

Last updated at Posted at 2021-01-14

delegateとは

Swiftを勉強しているとdelegateというのがよく出てきます。
例えば以下の例

ViewController.swift
tableView.delegate = self
tableview.dataSource = self

delegateを和訳すると委譲や委任らしいですが日本語の意味は理解できても、「ほぉ、それで?」と思いますよね。
てことで、どういう使われ方をしているか見ていきましょう。

delegateの使い方

そのクラスができない処理を他のクラスに代わりにしてもらうというものなんですが、すこしコードを見てみましょう
今回はUITextViewについてです。

ViewController.swift
textView.delegate = self
ViewController.swift
extension ViewController: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        // textViewのtextに変更が会った時の処理
        if !textView.text.isEmpty {
            print(textView.text)
        }
    }
}

こんな感じでtextViewだけじゃできない処理をViewControllerに代わりにやってもらうことができます。
他にもpresentで画面を表示したりするのはViewControllerじゃないとできないので、タップして画面表示させたいときとかに使います。

delegateを実装

delegateはprotocolで宣言します。
: AnyObjectの部分はdelegateをclassでしか使えなくするためらしい??
weakを使えるようにするためらしいです。
詳しくは以下を参照してください。

Swift で Class-Only Protocol を定義する

protocol CustomViewDelegate: AnyObject {
    public func customView()
}
CustomView.swift
class CustomView {
    weak var delegate: CustomViewDelegate?
    @IBOutlet var button: UIButton!
    @IBAction func button() {
        delegate.customView()
    }
}

delegate変数の宣言の時のweakはメモリリークを避けるためのなんたら〜らしいです。
追記:weakについてコメントしてくださっているのでそちらも見てください。

【Swift】weakやunownedなどの参照についてまとめてみた

まとめ

なんやかんや書いてきましたが、Twitterとかのプロフィール画像をタップした時に相手のプロフィール画面に飛ぶ時とかにつかえるってことですね!

2
3
2

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
2
3