[英]Method to return specialised type of generic protocol swift
我有一個通用協議,它有一個返回通用參數的方法。 該協議有兩種實現,它們都將字符串作為返回類型。 我想要一種基於某些參數構建類似於類集群的特定實例的方法。 該方法約束了泛型類型,但嘗試返回時出現錯誤:
“無法將 StringReturn 類型的返回表達式轉換為返回類型 T”
protocol GenericProtocol {
typealias ReturnType
func doSomething() -> ReturnType
}
struct StringReturn : GenericProtocol {
func doSomething() -> String {
return "first"
}
}
struct AnotherStringReturn : GenericProtocol {
func doSomething() -> String {
return "another"
}
}
func build<T : GenericProtocol where T.ReturnType == String>(param: String) -> T {
if .. {
return StringReturn()
} else {
return AnotherStringReturn
}
}
您想要實現的是使用泛型函數使用 Swift 的類型約束創建對象的實例。
請注意 Apple 文檔中的一般語法:
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) { // function body goes here }
在您的函數中,無法在函數執行時推斷T
是什么類型,因為您沒有將其作為參數傳遞給函數,因此您無法說出輸出是什么類型。
如果你想使用帶有類型約束的泛型函數,你可以在你的協議中添加一些init
並使用這樣的函數:
func build<T : GenericProtocol where T.ReturnType == String>(object: T.Type, param: String) -> T {
// Your code here
return T.init()
}
let str = build(StringReturn.self, param: "name")
希望能幫助到你!
在最新的 Swift 版本中,可以使用不透明類型而不是協議泛型來實現。
斯威夫特 5.3
您可以將不透明類型視為與泛型類型相反的類型。 泛型類型讓調用函數的代碼選擇該函數參數的類型並以一種從函數實現中抽象出來的方式返回值。 例如,以下代碼中的函數返回一個依賴於其調用者的類型:
protocol Fighter { }
struct XWing: Fighter { }
func launchFighter() -> Fighter {
XWing()
}
let red5 = launchFighter()
它需要在您的協議名稱之前使用關鍵字some :
func launchOpaqueFighter() -> some Fighter {
XWing()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.