

<https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson3.html#//apple_ref/doc/uid/TP40015214-CH22-SW1>

iOS Developer Libraryのswiftチュートリアル、Connect the UI to
Codeの章にてdelegateについて学んでいた際にわからない箇所があったので質問させて頂きます。

[code]

    import UIKit
        class ViewController: UIViewController, UITextFieldDelegate {
    
        @IBOutlet weak var nameTextField: UITextField!
        @IBOutlet weak var mealNameLabel: UILabel!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            nameTextField.delegate = self
    
        func textFieldShouldReturn(textField: UITextField) -> Bool {
            textField.resignFirstResponder()
            return true
        }
    
        func textFieldDidEndEditing(textField: UITextField) {
            mealNameLabel.text = textField.text
        }
    
        @IBAction func setDefaultLabelText(sender: UIButton) {
            mealNameLabel.text = "Default Text"
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }    
    
    }
    
[/code]

以下の部分ですが、ViewControllerがテキストフィールドのdelegateになること意味していると理解しています。

[code]

    nameTextField.delegate = self
    
[/code]

そこで

[code]

    nameTextField.delegate = ViewController()
    
[/code]

と書き換えたところコード上ではエラーがでないのですが、シミュレーターではテキストフィールドに文字を入力し、リターンキーを押してもラベルは変更されなくりました。

このselfは何を参照しているのでしょうか。


CC BY-SA 3.0
2016-07-09T08:19:37.213
27472
2018-03-07T21:10:13.643
2018-03-07T21:10:13.643
19110
17115
question
swift swift2 delegate
selfの参照先について


まずはクラスとインスタンスの関係について、正しく理解してください。

クラスというのは単なる設計書であり、インスタンスというのはその設計書に基づいて製造されたロボットのようなものです。「インスタンス化」や「インスタンスの作成」と言うのは、ロボットを新しく製造していることになります。

以上のことを踏まえて、`self`が何を指しているのかといえば、「その時に命令を実行しているロボット自身」を表します。

[code]

    nameTextField.delegate = self
    
[/code]

と書けば、その時点でその命令を実行しているロボットが自分自身をdelegateとして設定しています。そのロボットは画面に表示される自分自身専用のviewを持っていますし、iOSのシステムがそのロボットを製造した後`@IBOutlet`に必要なインスタンス(これも種類は違えど別のロボットですね)を与えています。

ところが、

[code]

    nameTextField.delegate = ViewController()
    
[/code]

と書くと、これは同じ`ViewController`という型式のロボットではありますが、今現在画面表示を担当しているロボットとは全く別の新しいロボットを作ったことになります。iOSが作成したロボットと違ってイニシャライザを直接指定して作ったロボットの`@IBOutlet`に、何かが自動的に設定されることもありません。

何が起こっているかご理解いただけましたでしょうか。

* * *

「ロボット」比喩は、人によってはかえって分かりにくく感じることもあるようです。分からない点・お気付きの点があれば、コメント等でご指摘ください。


CC BY-SA 3.0
2016-07-09T09:06:46.750
27473
2016-07-09T09:06:46.750
13972
27472
answer