タイトルの通りなんですがselfを単体で使うのはどういうわけでしょうか?selfの後にドットを挟んでそのクラス内のプロパティやメソッドを指定するならわかりますが、selfを単体で使うという事が不思議に思います。
このコードを包括するクラスが批准しているUITextFieldDelegateを消すとエラーが出たのでUITextFieldDelegateとういうプロトコルが関係しているのでしょうか。またこの記述の意味は何でしょうか?
なお問題のコードはViewDidload内に定義されています。
Text.delegate = self
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ベストアンサー
Delegate & Protocol の簡単な例
・「プロトコルA」を「UITextFieldDelegate」
・「クラスA」 を「ViewController」
・「クラスB」 を「UITextField」
・「methodA」 を「func textFieldShouldReturn(textField: UITextField) -> Bool 」
と置き換えると分かりやすいかと思います。
※func textFieldShouldReturn(textField: UITextField) -> Boolは以下で質問されているメソッドです。
こちらはoptional扱いなので実装が必須ではありませんが、、、
superクラスのメソッドをoverrideせずに上書きしている?
UITextFieldクラスには同じ様にUITextFieldDelegateプロトコル型の変数が定義してあります。
swift
1 2// プロトコルAを定義(プロトコルAに準拠したものは、必ずmethodAを実装しなければいけない) 3protocol ProtocolA { 4 func methodA() 5} 6 7// プロトコルAに準拠したクラスAを定義 8class ClassA: ProtocolA { 9 10 // クラスBを生成 11 var classB = ClassB() 12 13 init () { 14 // クラスBのdelegate変数に自分自身を設定 15 // クラスAはプロトコルAに準拠しているので設定できる 16 classB.delegate = self 17 } 18 19 // プロトコルAに準拠したため実装が必須のmethodA() 20 func methodA() { 21 // Action 22 } 23} 24 25// クラスBを定義 26class ClassB { 27 28 // クラスAのインスタンスを格納するためのdelegate変数 29 // 型はプロトコルA型 30 var delegate: ProtocolA! 31 32 func something() { 33 // プロトコルAに適合しているインスタンスに対してmethodA()を呼び出す 34 delegate.methodA() 35 } 36}
図にしてみました、少しでもイメージができたら幸いです。
投稿2016/03/25 13:27
編集2016/03/26 08:10総合スコア8490
0
オブジェクトと,メソッド(プロパティ)との関係を考えるとわかりやすいでしょう。
メソッドはオブジェクトに対して「命令」することです。
例えば,String型のオブジェクトに対して「おまえ,自分自身を大文字にして表現してみろよ」という命令を考えた時,NSString.capitalizedString
という構文になります(あくまで例ですので構文自体は正しくありません。)
プロパティも本質的には同様で,オブジェクトに対して,「覚えておけ」「覚えておいたものを教えてくれ」と命令しているようなものです。
そこで,Text.delegate
という構文を上記の考え方で翻訳すると,Textよdelegateというキーで覚えておけ,またはdelegateというキーで覚えてたものを教えてくれ,ということになります。
さて,Swiftを始めオブジェクト指向の言語ではほとんどを「オブジェクト」単位でとらえていきます。文字もオブジェクト,数値もオブジェクト,データもオブジェクト,もちろんクラスもインスタンスもオブジェクト。
だとすると,プロパティとして「覚えさせる」内容も「オブジェクト」になります。
なのでText.delegate =
として覚えさせる右辺は「オブジェクト」になりますね。なので右辺に来るのは自分自身を表すオブジェクトself
になるのです。self.method
としてしまうとdelegateに命令を覚えさせることになってしまいますね。
デリゲートというのは,処理を移譲することですが,率直に言ってデリゲートをselfにすると,初めはわかりにくいのは確かです。処理を自分自身に移譲するって,どういうこと?と思いますが,今はそんなもんだと思って,コピペでも大丈夫です。
iOSの開発(iOSに限られないですが)に慣れてくるとデリゲートにselfではなく別のインスタンスを指定することもできるようになります。そのとき,ようやくデリゲートの使い道がわかるようになるでしょう。
投稿2016/03/25 12:25
総合スコア1680
0
こんにちは。
これはどこに実装されているコードでしょうか。
ViewControllerですか?であればViewControllerインスタンスをSetしているだけです。
UITextFieldDelegateプロトコルを実装したインスタンスを渡すことが目的です。
以下など参考になるのではないでしょうか。
http://qiita.com/mochizukikotaro/items/a5bc60d92aa2d6fe52ca
投稿2016/03/25 12:15
総合スコア4791
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/26 01:11 編集