質問編集履歴

2 ジェネリクスの文言を追加

kuma3

kuma3 score 59

2017/02/16 16:05  投稿

Swift:プロパティが特定の型のインスタンスでかつプロトコルに適合していることを表現する方法
Swiftのプロパティの型表現で題記のような表現を行うにはどのようなコードを書く必要があるでしょうか?
Swiftのバージョンは3.0です。
具体的な例としては下記のような状況でプロトコルViewResizableのviewプロパティがUIViewのインスタンスもしくはサブクラスのインスタンスである場合に、ViewShowableで宣言されているメソッドを実装していることを保証したいです。
ViewResizableを採用するクラスがプロパティとして持つviewはViewShowableを採用しているクラスです。ViewResizableのviewプロパティでその特定のクラスを指定することもできますが、ViewShowableを採用するクラスは様々なクラスが考えられるためそれでは、特定のクラス毎にプロトコルを宣言しなくてはなりません。
そのため、プロパティの記述で特定の型のインスタンスでかつプロトコルを採用しているインスタンスを表現することでコードの記述量を減らしたいです。
そのため、プロパティの記述(ジェネリクス等何かしらの方法)で特定の型のインスタンスでかつプロトコルを採用しているインスタンスを表現することでコードの記述量を減らしたいです。
```swift
protocol ViewShowable {
   func show()
   func hide()
}
protocol ViewResizable {
   // 下の行はエラーになるが、viewからViewShowableのメソッドを呼び出したい
   var view: UIView & ViewShowable! { get }
}
extension ViewResizable {
   func resizeAndShow() {
       ビューのフレーム変更コード
       // showメソッドを呼び出したい
       view.show()
   }
}
```
アドバイスいただけると助かります。
よろしくお願いします。
  • Generics

    19 questions

    Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

  • Swift

    11338 questions

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

1 具体的に処理したい内容を詳述、実行したいコード例を追加で記述

kuma3

kuma3 score 59

2017/02/16 15:27  投稿

Swift:プロパティが特定の型のインスタンスでかつプロトコルに適合していることを表現する方法
Swiftのプロパティの型表現で題記のような表現を行うにはどのようなコードを書く必要があるでしょうか?
Swiftのバージョンは3.0です。
具体的な例としては下記のような状況でプロトコルViewResizableのviewプロパティにUIViewに追加でViewShowableプロトコルに適合しているものと表現したいです。
具体的な例としては下記のような状況でプロトコルViewResizableのviewプロパティがUIViewのインスタンスもしくはサブクラスのインスタンスである場合に、ViewShowableで宣言されているメソッドを実装していることを保証したいです。
ViewResizableを採用するクラスがプロパティとして持つviewはViewShowableを採用しているクラスです。ViewResizableのviewプロパティでその特定のクラスを指定することもできますが、ViewShowableを採用するクラスは様々なクラスが考えられるためそれでは、特定のクラス毎にプロトコルを宣言しなくてはなりません。
そのため、プロパティの記述で特定の型のインスタンスでかつプロトコルを採用しているインスタンスを表現することでコードの記述量を減らしたいです。
```swift
protocol ViewShowable {
   func show()
   func hide()
}
protocol ViewResizable {
   // 下の行はエラーになるが、viewにViewShowableプロトコルを適合させたい
   // 下の行はエラーになるが、viewからViewShowableのメソッドを呼び出したい
   var view: UIView & ViewShowable! { get }
}  
 
extension ViewResizable {  
   func resizeAndShow() {  
       ビューのフレーム変更コード  
       // showメソッドを呼び出したい  
       view.show()  
   }  
}
```
アドバイスいただけると助かります。
よろしくお願いします。
  • Generics

    19 questions

    Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

  • Swift

    11338 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る