質問: text return true } } ```
回答: > > > > > > outputTextはUITextFieldクラスのインスタンスなので、これは、outputTextのtextプロパティにtextを代入することを意味します。 > > > > > > > > > Qiitaのテキストに間違いがありますね。**`outputText`は`UITextField`のインスタンスではありません。** > > 1.実際にUITextFieldクラスのインスタンスであるのか?またそれはどのコードから読み解くことができるのかをアドバイス願えますでしょうか?また、後段との因果関係、なぜUITextFieldのインスタンスまたはUILabelのインスタンスであれば文字列を渡せるのかをご教示願えますでしょうか? > > > `outputText`がどのインスタンスか、ということはソースコードの ``` @IBOutlet weak var inputText: UITextField! @IBOutlet weak var outputText: UILabel! ``` からみてもわかる通り`UILabel`のインスタンスです。 「なぜ`UITextField`のインスタンスまたは`UILabel`のインスタンスであれば文字列を渡せるのか」と言う部分ですが、上記のtypoを考慮にいれれば「なぜ`UITextField`のインスタンス(のプロパティである`text`)であれば文字列を渡せるのか」ということかと思います。 それは、「テキストフィールドに表示されている文字列は、`UITextField`の`text`プロパティで保持されるから」と言うことになります。 Appleのドキュメントも合わせて参考にされるといいかとおもいます(クイックメニューにも同じような内容は表示されます)。 任意のタイミングで`UTTextField`の`text`を参照すれば、テキストフィールドに表示されている文字列を取得することができます。しかし、プログラムで逐一`text`の値を参照することは効率的とはいえません。 なのでどのようにしているかと言うと、Delegateという考え方を使って、**ある条件**が満たされた場合に呼び出されるメソッドを使い、そのタイミングで**ある操作**をしています。 `UITextField`には、`textFieldShouldReturn(_:)`というデリゲートがあります。 これは、「キーボードのリターン(に相当する)ボタンが押された時」に呼び出されるメソッドです。つまり、**「ある条件」で呼び出されるメソッド**ということになります。 では、「キーボードのリターンボタンを押された時」にする処理とは何でしょうか。 それは、プログラムを組む人間が自由に決めて良い内容です。 Qiitaの例では、リターンボタンを押されたタイミングで「テキストフィールドに入力されている文字列を、ラベルに表示させる」という処理を行わせています(もちろん、それ以外の処理もあります)。 それが、 ``` let text = textField.text outputText.text = text ``` という処理ということになるわけです。つまり、これが**「ある操作」**ということになります。 Delegateの解説は、「移譲する」視点から書かれたものが多いと思います。しかし、最初のうちは「移譲される」側、つまり今回の例だと、エンターボタンを押された時の具体的な処理を移譲される側としてプログラムを記述することが多いとおもます。なので、「移譲される側」としてDelegateの動作を考えてみた方が理解が容易かもしれません。 また、ここ1-2ヶ月の間でも、teratailではSwiftにおけるDelegate処理に関する質問が2,3出ていますので、それらの解説も合わせてご覧になるのも良いかもしれません。 > > 2.また、基本的な理解なのですが、self.propなどでは自分自身のクラスの中のpropプロパティにアクセスできることは理解しているのですが、inputText.delegate = selfの様な記法にけるクラスはそのクラス全体を指している(特定のプロパティやメソッドではない)という理解であっていますでしょうか? > > > `self`というキーワードは、「自分自身のインスタンスそのもの」をあらわします。クラスの中で定義したインスタンスは変数名や定数名でアクセスできますが、自分自身のインスタンスは変数・定数には入れていません(やる方法はあると思いますが)。その代わり`self`というキーワードを使って汎用的にアクセスできるようになっているわけです。 `inputText.delegate = self`という記述は、`delegate`という変数に自分自身のインスタンスを入れる定義です。なので、厳密には「クラス全体を指している」という表現ではなく、「自分自身のインスタンスを指している」ということになると思います。