【发布时间】:2020-05-07 12:06:41
【问题描述】:
我正在尝试构建一个查找器,该查找器尝试并查找在闭包内传递给它的多种类型。
enum SomeError: Error {
case notInitialized
}
struct TestFinder {
func getSomething<T, U>(_ function: @escaping (T) -> U) throws -> U {
guard let t: T = get() else {
throw SomeError.notInitialized
}
return function(t)
}
func getSomething<T, U, V>(_ function: @escaping (T, U) -> V) throws -> V {
guard let t: T = get(), let u: U = get() else {
throw SomeError.notInitialized
}
return function(t, u)
}
func getSomething<T, U, V, W>(_ function: @escaping (T, U, V) -> W) throws -> W {
guard let t: T = get(), let u: U = get(), let v: V = get() else {
throw SomeError.notInitialized
}
return function(t, u, v)
}
private func get<T>() -> T? {
nil
}
}
struct UserDetails {
let name: String
let roll: String
}
我将查找器称为:
let testReturnType = try? TestFinder().getSomething(UserDetails.init)
编译器给我一个错误:
“getSomething”的使用不明确
此错误的原因(来自文档):
您可以通过在类型参数上提供不同的约束、要求或同时提供两者来重载泛型函数或初始化程序。当您调用重载的泛型函数或初始化程序时,编译器会使用这些约束来解析要调用的重载函数或初始化程序。
但如果我评论:
func getSomething<T, U>(_ function: @escaping (T) -> U) throws -> U
一切都开始工作了。这与编译器无法识别要解析的函数签名有关。
对此有什么特别的解决方案吗?
【问题讨论】:
标签: ios swift generics closures overloading