💨

【Swift】俺はデリゲートなんか使わない。

2017/06/20に公開約2,900字

環境

Swift 3.1
Xcode 8.3.3

はじめに

Swift を勉強中の初心者です。Ruby と Python をちょっとしかやったことがありません。
デリゲート難しいし、使う意味がわかりませんでした。
だからデリゲートを使わない実装をしてみました。

実装内容

「TextField(textField)に文字列を入力した後、return を押したら Label(label)にその文字列が表示する」

032d4bb4a0add2be1948bec3e048227f.gif

俺はデリゲートなんか使わない

結論:できませんでした。
同じ実行結果は得られましたが、「 return を押したら 」という処理をどうすればいいのかわかりません。
辛うじてできた最終的な実装内容は、「TextField(inputText)に文字列を入力後、 button(fromFieldToLabel)を押したら Label(outputText)に入力された文字列が表示される」というものです。

005c8194729f917d5f8db590273fd42b.gif

ViewController.swift
import UIKit
// TextField(inputText)に文字列を入力後、 button(fromFieldToLabel)を押したらLabel(outputText)に入力された文字列が表示される
class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }

  // TextFieldとの関連付け
  @IBOutlet weak var inputText: UITextField!
  // Labelとの関連付け
  @IBOutlet weak var outputText: UILabel!
  // Buttonが押された時に実行されるメソッド
  @IBAction func fromFieldToLabel(_ sender: Any) {
    // キーボードを閉じる
    inputText.resignFirstResponder()
    // 入力された文字列を取得
    let text = inputText.text
    // 取得した文字列をLabelに表示
    outputText.text = text
  }
}

Swift 経験者の方であれば実装可能なのかもしれませんが、そのような記事は見つかりませんでしたし、もちろん私は到底実装することはできませんでした。

私はここで初めて デリゲートの必要性 を実感することになります。

自分では実装できないけど、デリゲートを利用すれば Swift 開発元の Apple が用意してくれている便利メソッドが使える!
たとえ将来的に自力で実装できたとしても、自力で実装するよりもすでに用意されているメソッドを利用した方がはるかに楽じゃん!

ここにきてようやくデリゲートの説明がしっくりしてきます。

return を押したら」という処理はデリゲートを利用すれば簡単に実装できるんです。

デリゲートを用いた実装

ViewController.swift
import UIKit

class ViewController: UIViewController, UITextFieldDelegate {//ViewControllerクラスをUITextFieldDelegateに適用する

  @IBOutlet weak var textField: UITextField!
  @IBOutlet weak var label: UILabel!

  override func viewDidLoad() {
    super.viewDidLoad()
    // delegateの通知先を自分自身に設定
    textField.delegate = self
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }

  // delegateの通知内容を指定する
  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    // キーボードを閉じる
    textField.resignFirstResponder()
    // 入力された文字列を取り出す
    let text = textField.text
    // 取得した文字列をLabelに表示
    label.text = text
    return true
  }
}

追加実装した内容は主に 3 つです。
1. クラスにデリゲードを適用させる
2. デリゲートの通知先を自分自身に設定する
3. デリゲートの通知内容を指定する

参考文献

デリゲートの説明は私がするより他の記事を読んでいただいた方がわかりやすいと思います。
デリゲートの概念を理解するためにわかりやすかったサイトや記事を紹介させていただきます。

Swift 言語を学ぶ
プロトコルとデリゲートのとても簡単なサンプルについて

デリゲートとの戦いは続く

inputText.delegate = self ってなんや...
次回:【Swift】hogehoge.delegate = self は何をしているのか。

GitHubで編集を提案

Discussion

ログインするとコメントできます