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