質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

4回答

7731閲覧

Text.delegate = self←これについて質問です

Blue0999

総合スコア148

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

6クリップ

投稿2016/03/25 09:55

編集2016/03/25 10:23

タイトルの通りなんですがselfを単体で使うのはどういうわけでしょうか?selfの後にドットを挟んでそのクラス内のプロパティやメソッドを指定するならわかりますが、selfを単体で使うという事が不思議に思います。
このコードを包括するクラスが批准しているUITextFieldDelegateを消すとエラーが出たのでUITextFieldDelegateとういうプロトコルが関係しているのでしょうか。またこの記述の意味は何でしょうか?
なお問題のコードはViewDidload内に定義されています。

Text.delegate = self

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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プロトコル型の変数が定義してあります。
image2

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}

図にしてみました、少しでもイメージができたら幸いです。

image

投稿2016/03/25 13:27

編集2016/03/26 08:10
_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Blue0999

2016/03/26 01:11 編集

ご回答ありがとうございます! こんがらがってたいろいろな関係が整理でき内容を理解する事ができました! delegate = selfのselfにはmethodAも含まれてるのでClassBのインスタンスで使えるという事ですね。 毎回丁寧に説明していただきありがとうございます。
guest

0

そのクラスのインスタンスではないでしょうか

投稿2016/03/25 12:28

hogeshi_

総合スコア47

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Blue0999

2016/03/26 00:57

ご回答ありがとうございます。 調べてみると確かにそのようです。
guest

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

NCC1701

総合スコア1680

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Blue0999

2016/03/26 00:49

プログラミングの勉強はが初めてなのでわからない事が多いのですが、オブジェクトイコールクラスのインスタンスだと記事で読んだ記憶があります。文字列や数値などのデータもオブジェクトにより作られているのですね…なんだかとても感心しました(笑)。
Blue0999

2016/03/26 00:52 編集

Objective-Cという言葉も少し身近に感じました
guest

0

こんにちは。

これはどこに実装されているコードでしょうか。
ViewControllerですか?であればViewControllerインスタンスをSetしているだけです。
UITextFieldDelegateプロトコルを実装したインスタンスを渡すことが目的です。

以下など参考になるのではないでしょうか。
http://qiita.com/mochizukikotaro/items/a5bc60d92aa2d6fe52ca

投稿2016/03/25 12:15

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Blue0999

2016/03/26 00:43

ご回答ありがとうございます! 教えて頂いたページを一読させていただきました。 デリゲートに関して曖昧な認識だったのでようやくしっかり理解する事ができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問