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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

1回答

1252閲覧

protocol、delegateについて

AKTO

総合スコア11

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2018/10/11 15:10

編集2018/10/12 01:26

以下はViewController.swiftになるのですが、コメントの内容はあっているでしょうか。
つまり、"変数delegateは、TestDelegateプロトコルに準拠したオプショナルなプロトコル"で間違いないでしょうか。
そもそも、オプショナルなプロトコルなんてあるのでしょうか。
また、delegate?.test(略)とありますが、
let testClass = TestClass()
testClass.delegate = self
testClass.test()
とした時にいつどこでアンラップされているのでしょうか。
?を使っているので暗黙的にアンラップされないような気がするのですが...。

swift

1import UIKit 2 3protocol TestDelegate: class { 4 func test(string: String) 5} 6 7class TestClass { 8 weak var delegate: TestDelegate? // 変数delegateは、TestDelegateプロトコルに準拠したオプショナルなプロトコル 9 10 func test() { 11 delegate?.test(string: "testメソッドが実行されたという通知を受け取る。") 12 } 13} 14 15class ViewController: UIViewController, TestDelegate { 16 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 // Do any additional setup after loading the view, typically from a nib. 20 21 let testClass = TestClass() 22 testClass.delegate = self 23 testClass.test() 24 25 } 26 27 func test(string: String) { 28 print(string) 29 } 30}

swift初学者の私でも理解できる回答をいただけると幸いです。

p.s. 太字の3点について回答していただけると助かります。

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

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

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

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

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

fuzzball

2018/10/12 01:34

2つ目と3つ目の太字は、1つ目の太字が合っている前提で書かれていますか?
AKTO

2018/10/12 03:05 編集

2つ目は合っている前提ですね。 3つ目は合っていてもいなくても、?となっている以上、いつかアンラップされるはずで、それはいつだろうという疑問ですので、合っている前提ではないと思います。
fuzzball

2018/10/12 03:50

delegate?.test(string: "testメソッドが実行されたという通知を受け取る。") ← これの delegate? でアンラップしていますが、そういうことではないのでしょうか?
AKTO

2018/10/12 03:56

オプショナルチェイニングの存在を完全に忘れていました。ご指摘ありがとうございます、とんでもない勘違いを失礼しました。
guest

回答1

0

変数delegateはTestDelegateプロトコルに準拠したインスタンスを格納するオプショナル変数です。

【追記】

swift

1//TestClass 2func test() { 3 //self.delegateはTestDelegate型(オプショナル)で、 4 //nilもしくはTestDelegateプロトコルに準拠したクラス(のインスタンス)が入っています 5 if let delegate = self.delegate { 6 //この中のdelegateはViewController型で、 7 //ViewControllerのインスタンスが入っています 8 delegate.test(string: "testメソッドが実行されたという通知を受け取る。") 9 } 10}

投稿2018/10/12 00:06

編集2018/10/12 04:05
fuzzball

総合スコア16731

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

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

AKTO

2018/10/12 01:35

ご回答いただきありがとうございます。 変数delegateがTestDelegateプロトコルに準拠したクラスを格納すること、オプショナルな変数であることは、一応理解しているつもりです。 ただ、変数delegate自体がプロトコルなのか、クラスなのか、構造体なのか、はたまたInt型やDouble型なのか、それがわかりません...。
fuzzball

2018/10/12 02:42 編集

「TestDelegateプロトコルに準拠したクラス」型(オプショナル)です。 略すと、TestDelegate型(オプショナル)です。 let value: Int? valueはInt型を格納するオプショナル変数です。 ここから「変数value自体がクラスなのか、構造体なのか、はたまたDouble型やString型なのか、それがわかりません」という疑問が出てきますか?
AKTO

2018/10/12 03:09 編集

つまり、変数delegateはTestDelegateプロトコルに準拠したオプショナルなクラスということでしょうか。 このオプショナルは、いつアンラップされているんでしょうか。
fuzzball

2018/10/12 03:57 編集

>>つまり 違います、と言いたいところですが、ちょっと保留にします。 考えていることは合っていても、うまく文章に出来ていないかも知れないので。 私にしても、キチンと勉強しているわけではないので、正しい言葉/単語を使えていない可能性があります。 >>いつアンラップされているんでしょうか。 追記・修正の方にも書いてしまいましたが、 delegate?.test(string: "testメソッドが実行されたという通知を受け取る。") これの delegate? でアンラップしています。
fuzzball

2018/10/12 04:06

参考になるかどうか分かりませんが、コードを追加してみました。
AKTO

2018/10/12 08:52

追記についてですが、たしかにオプショナルバインディングでもアンラップできますね。 アンラップされることがよく分かりました。
fuzzball

2018/10/15 00:18 編集

コードの意図は、アンラップの方法ではありません。変数delegateの型と、アンラップして取り出した値の型について説明しました。(ようするにコメント部分がメインです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問