0
ここでは私の遊び場ですが、openInitial111()関数を使用したいと思いますが、openInitial222()は完全に動作しています。非ジェネリック関数からジェネリック関数へのスウィフトパラメータの渡し方
protocol Module : Screen {
init()
}
extension Module {
static func entity() -> Self {
return Self()
}
}
protocol Screen {
}
class FFF: Module {
required init() {
}
}
class ZZZ: NSObject {
func openInitial111(initialModule: Module.Type) {
self.openViewController(itemWithScreenStyle: initialModule.entity()) // Error : Cannot invoke openViewController
//with an argument list of type '(initWithScreenStyle:Module)
}
func openInitial222(initialModule: Module.Type) {
let f = FFF.self // FFF.Type
self.openViewController(itemWithScreenStyle: f.entity()) // works
}
func openViewController<T: Screen>(itemWithScreenStyle: T) {
print("generics")
}
}
[ProtocolsはSwiftに準拠していません](http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself) - したがって、準拠する型として 'Module'を使用することはできません'Screen'には' openViewController'の 'T'を具体的な型にする必要があります(これが' FFF'で動作する理由です)。 'Module'を使って動作させる一つの方法は、リンクされたQ&AへのRobの答えに示されているように、タイプ消去を作ることです。 – Hamish