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