🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

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

Q&A

解決済

1回答

528閲覧

swift interfaceとmethodの違い

furusawa

総合スコア40

Swift

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

0グッド

0クリップ

投稿2019/12/10 04:35

https://qiita.com/lovee/items/5e041ad7c1c96f0afcc5

swift

1 2protocol SomeProtocol { 3 func printSelf() 4} 5 6extension SomeProtocol { 7 func printSelf() { 8 print("SomeProtocol") 9 } 10} 11 12class SomeClass: SomeProtocol { 13 14} 15 16class SomeSubClass: SomeClass { 17 func printSelf() { 18 print("SomeSubClass") 19 } 20} 21 22class Parent { 23 let someClass: SomeClass 24 // init(someClass: SomeClass) { ... } 25 func printSelf() { 26 someClass.printSelf() 27 } 28} 29 30let ssc = SomeSubClass() 31let p = Parent(someClass: ssc) 32 33ssc.printSelf() // 出力:SomeSubClass 34p.printSelf() // 出力:? 35 36/* 選択肢 37A:SomeProtocol 38B:SomeClass 39C:SomeSubClass 40*/

上のコードを手元の実行環境で実行したところ
エラーが存在したのでエラーを解消したところ
選択肢cと出ました
しかし上記のサイトでは回答は
選択肢aとあります
なぜこのようになったのか教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Playgroundでテストしました。
こうなっています。それは当然でしょう。(正解)
SomeClassはSomeProtocolを継承して、SomeProtocolの拡張にはprint("SomeProtocol")が実行されます。

ssc.printSelf() // 出力:SomeSubClass p.printSelf() // 出力:SomeProtocol

Swift

1protocol SomeProtocol { 2 func printSelf() 3} 4 5extension SomeProtocol { 6 func printSelf() { 7 print("SomeProtocol") 8 } 9} 10 11class SomeClass: SomeProtocol { 12 13} 14 15class SomeSubClass: SomeClass { 16 func printSelf() { 17 print("SomeSubClass") 18 } 19} 20 21class Parent { 22 let someClass: SomeClass 23 24 init(someClass: SomeClass) { 25 self.someClass = SomeClass() 26 } 27 func printSelf() { 28 someClass.printSelf() 29 } 30} 31 32let ssc = SomeSubClass() 33let p = Parent(someClass: ssc) 34 35ssc.printSelf() // 出力:SomeSubClass 36p.printSelf() // 出力:SomeProtocol

「C」にするために:

ssc.printSelf() // 出力:SomeSubClass p.printSelf() // 出力:SomeSubClass

ParentのsomeClassのタイプをSomeSubClassにしないといけないようです。

swift

1protocol SomeProtocol { 2 func printSelf() 3} 4 5extension SomeProtocol { 6 func printSelf() { 7 print("SomeProtocol") 8 } 9} 10 11class SomeClass: SomeProtocol { 12 13} 14 15class SomeSubClass: SomeClass { 16 func printSelf() { 17 print("SomeSubClass") 18 } 19} 20 21class Parent { 22 let someClass: SomeSubClass 23 24 init(someClass: SomeSubClass) { 25 self.someClass = someClass 26 } 27 func printSelf() { 28 self.someClass.printSelf() 29 } 30} 31 32let ssc = SomeSubClass() 33let p = Parent(someClass: ssc) 34 35ssc.printSelf() // 出力:SomeSubClass 36p.printSelf() // 出力:SomeProtocol

投稿2019/12/10 05:51

vanderlvov

総合スコア687

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問