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

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

ただいまの
回答率

90.47%

  • Swift

    7468questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,508

Blue0999

score 60

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

Text.delegate = self

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

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

// プロトコルAを定義(プロトコルAに準拠したものは、必ずmethodAを実装しなければいけない)
protocol ProtocolA {
    func methodA()
}

// プロトコルAに準拠したクラスAを定義
class ClassA: ProtocolA {

    // クラスBを生成
    var classB = ClassB()

    init () {
        // クラスBのdelegate変数に自分自身を設定
        // クラスAはプロトコルAに準拠しているので設定できる
        classB.delegate = self
    }

    // プロトコルAに準拠したため実装が必須のmethodA()
    func methodA() {
        // Action
    }
}

// クラスBを定義
class ClassB {

    // クラスAのインスタンスを格納するためのdelegate変数
    // 型はプロトコルA型
    var delegate: ProtocolA!

    func something() {
        // プロトコルAに適合しているインスタンスに対してmethodA()を呼び出す
        delegate.methodA()
    }
}

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

image

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/26 09:42 編集

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

    キャンセル

0

こんにちは。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/26 09:43

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

    キャンセル

0

オブジェクトと,メソッド(プロパティ)との関係を考えるとわかりやすいでしょう。
メソッドはオブジェクトに対して「命令」することです。
例えば,String型のオブジェクトに対して「おまえ,自分自身を大文字にして表現してみろよ」という命令を考えた時,NSString.capitalizedStringという構文になります(あくまで例ですので構文自体は正しくありません。)
プロパティも本質的には同様で,オブジェクトに対して,「覚えておけ」「覚えておいたものを教えてくれ」と命令しているようなものです。
そこで,Text.delegateという構文を上記の考え方で翻訳すると,Textよdelegateというキーで覚えておけ,またはdelegateというキーで覚えてたものを教えてくれ,ということになります。

さて,Swiftを始めオブジェクト指向の言語ではほとんどを「オブジェクト」単位でとらえていきます。文字もオブジェクト,数値もオブジェクト,データもオブジェクト,もちろんクラスもインスタンスもオブジェクト。
だとすると,プロパティとして「覚えさせる」内容も「オブジェクト」になります。

なのでText.delegate = として覚えさせる右辺は「オブジェクト」になりますね。なので右辺に来るのは自分自身を表すオブジェクトselfになるのです。self.methodとしてしまうとdelegateに命令を覚えさせることになってしまいますね。

デリゲートというのは,処理を移譲することですが,率直に言ってデリゲートをselfにすると,初めはわかりにくいのは確かです。処理を自分自身に移譲するって,どういうこと?と思いますが,今はそんなもんだと思って,コピペでも大丈夫です。

iOSの開発(iOSに限られないですが)に慣れてくるとデリゲートにselfではなく別のインスタンスを指定することもできるようになります。そのとき,ようやくデリゲートの使い道がわかるようになるでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/26 09:49

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

    キャンセル

  • 2016/03/26 09:49 編集

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/26 09:57

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

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Swiftのselfの意味は何ですか?

    swift の self の意味は何ですか? 英語だと自分自身という意味ですが、自分は何を指していますか? 例えば以下のコードの場合の2つのselfはどういう意味ですか?

  • 解決済

    <Swift>TableViewについて

    前提・実現したいこと <Swift> TODOアプリのように、TableViewCell内にTextFieldを組み込んで、 直接文字入力ができるような機能を実装したいと思い

  • 受付中

    SwiftでTextFieldの値を読み込む

    Swiftで、Textfieldに打ち込まれた値をString型で取得し、関数に打ち込みたいのですが、自分なりのやり方ではできませんでした。方法を具体的に教えてください。(一応、自

  • 解決済

    UIAlertController上のUITextFieldの未入力を防ぐ方法

    前提・実現したいこと 質問をご覧いただきまして、ありがとうございます。 現在、UIAlertController上のUITextFieldでinputしてもらうという機能を

  • 解決済

    xcode 画面遷移後の画面でのtextfieldで入力してエンターでキーボードを引っ込めたい

    前提・実現したいこと xcodeのswiftでタスク管理アプリを作りたい 発生している問題・エラーメッセージ メニュー画面から,タスクの入力画面に映った際の入力をエンター

  • 解決済

    UITableViewのタップの処理が実行されない

    UITableViewで写真のアルバム名を表示して、アルバムを選択できるようにしたいのですが、UITableViewのcellが選択できません。 http://qiita.co

  • 解決済

    デリゲート処理におけるselfの代入

    前提・実現したいこと swift 初心者です。イベントの受け方を調べていると、デリゲートについての解説があり理解できない部分があり、質問させていただきます。 xcodeのstory

  • 解決済

    iOS UIPickerViewとUISegmentedControlを用いたTableView

     前提・実現したいこと xcodeで以下の写真のようなタイムテーブルを作ろうとしています。PickerViewで場所を選択、SegmentedControlで日時を選択し、それに合

同じタグがついた質問を見る

  • Swift

    7468questions

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