2016-11-07 4 views
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") 
    } 
} 
+0

[ProtocolsはSwiftに準拠していません](http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself) - したがって、準拠する型として 'Module'を使用することはできません'Screen'には' openViewController'の 'T'を具体的な型にする必要があります(これが' FFF'で動作する理由です)。 'Module'を使って動作させる一つの方法は、リンクされたQ&AへのRobの答えに示されているように、タイプ消去を作ることです。 – Hamish

答えて

0

実際、コメントに示唆されているように、下敷きの問題はプロトコルがプロトコルに準拠していないことです。しかし、エラーメッセージは信じられないほど誤解を招きます。

関連する問題