[英]Can't call generic function from a generic struct
我在嘗試在擴展中創建一個函數時遇到問題,該函數會調用另一個泛型函數。 我創建了一個非常簡單的示例來顯示問題:
protocol Target {}
enum api {
case user
}
extension api: Target {}
protocol Mappable {}
struct User {}
extension User: Mappable {}
struct Provider<A: Target> {
}
extension Provider {
func requestObject<T: Mappable>(_ token: A, type: T.Type){
//some code
}
func getUser() {
requestObject(api.user, type: User.self)
//This code creates Error: Cannot invoke 'requestObject' with an argument list of type '(api, type: User.Type)'
}
}
任何人都可以幫助解釋如何創建函數getUser()並調用requestObject。 我知道一個解決方案是使struct Provider非泛型,但它會限制Provider,因此它不是真正的解決方案。
感謝幫助
問題是通過擴展通用Provider
類型而沒有任何類型約束並像你一樣聲明getUser
函數,編譯器只能推斷A
的類型是Api
,這比A:Target
更具限制性。 您需要使用條件一致性讓編譯器知道特定的getUser
實現應該僅存在於api
類型專用的Provider
類型中。
extension Provider where A == Api {
func getUser() {
requestObject(Api.user, type: User.self)
}
}
您還應該遵循Swift命名約定,即類型的upperCamelCase,因此將api
更改為Api
。
protocol Target {
}
enum api {
case user
}
extension api: Target {}
protocol Mappable {}
struct User {}
extension User: Mappable {}
struct Provider<A: Target> {
}
extension Provider {
func requestObject<T : Mappable>(_ token: A, type: T.Type) {
//some code
}
static func getUser() {
let provider = Provider<api>()
provider.requestObject(api.user, type: User.self)
//This code creates Error: Cannot invoke 'requestObject' with an argument list of type '(api, type: User.Type)'
}
}
據我所知,你的Provider
結構本身就是通用的,所以要調用它,你必須先將它專門化。 否則編譯器無法在requestObject調用中推斷出T的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.