尝试在扩展中创建一个函数时会遇到问题,该函数将调用另一个通用函数。 我创建了一个非常简单的示例来显示问题:
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,因此它并不是真正的解决方案。
感谢帮助
答案 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的类型。