繁体   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