簡體   English   中英

無法從通用結構調用泛型函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM