回答編集履歴

1 誤字の修正

kuma3

kuma3 score 59

2017/02/16 21:50  投稿

プロトコルとプロトコル拡張に型による制約をつけること、さらに利用するクラスでのジェネリクスの活用になり可能なことが分かりました。
プロトコルとプロトコル拡張に型による制約をつけること、さらに利用するクラスでのジェネリクスの活用により可能なことが分かりました。
コードは次の通りです。
```swift
protocol ViewShowable {
   func show()
   func hide()
}
protocol ViewResizable {
   associatedtype View
   var view: View! { get }
}
extension ViewResizable where View: UIView, View: ViewShowable {
   
   func resizeAndShow() {
       // 次のコードはエラーにならない
       print("\(self.view.bounds.size)")
       // 次のコードも呼び出せる
       self.view.show()
   }
}
// UIViewとViewShowableに適合するクラス
class ShowableView: UIView, ViewShowable {
   
   func show() {
       print("show")
   }
   
   func hide() {
       print("hide")
   }
}
// ジェネリクスクラスでの宣言
class Test<T: UIView>: ViewResizable where T: ViewShowable {
   
   var view: T!
   
   func test() {
       // 次のコードを呼び出せる
       self.resizeAndShow()
   }
}
// ジェネリクスクラスの呼び出し時にはジェネリクスの型による制約に適合している具体的なクラスを指定
let test = Test<ShowableView>()
```
上記のコードはプレイグランドでエラーなく実行できました。
ただし、ジェネリクスクラスではstatic格納型プロパティに対応していないエラー及び@objcが付いているメソッドに対応していないエラーが出たため、UIViewControllerでの採用を検討していた私のコードではこの2つのハードルを越えるのは難しく、利用を断念しました。

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