无法从通用结构调用通用函数

时间:2018-09-24 13:18:35

标签: swift generics

尝试在扩展中创建一个函数时会遇到问题,该函数将调用另一个通用函数。 我创建了一个非常简单的示例来显示问题:

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,因此它并不是真正的解决方案。

感谢帮助

2 个答案:

答案 0 :(得分:4)

问题是,通过在没有任何类型约束的情况下扩展通用Provider类型并像您一样声明getUser函数,编译器只能推断A的类型为{ {1}},比Api更具限制性。您需要使用条件一致性,以使编译器知道特定的A:Target实现仅应针对getUser类型专用的Provider类型存在。

api

您还应该遵守Swift命名约定,即类型的上命名规则为upperCamelCase,因此将extension Provider where A == Api { func getUser() { requestObject(Api.user, type: User.self) } } 更改为api

答案 1 :(得分:-1)

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的类型。