2016-11-07 18 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

[協議不符合自己斯威夫特(http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself) - 因此你不能用'Module'作爲一種符合爲'Screen',你需要'openViewController'的'T'是一個具體類型(這就是爲什麼它與'FFF'作品)。一種可能的方法,使其與工作'Module'將建立一個類型擦除,比如在羅布的回答顯示鏈接的Q&A。 – Hamish

回答

0

事實上,正如評論中所建議的,下層問題是協議不符合協議。錯誤信息雖然令人難以置信的誤導。