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
を使えるようにするためらしいです。
詳しくは以下を参照してください。
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についてコメントしてくださっているのでそちらも見てください。
まとめ
なんやかんや書いてきましたが、Twitterとかのプロフィール画像をタップした時に相手のプロフィール画面に飛ぶ時とかにつかえるってことですね!