Swift 使用类型约束泛型函数中的类型重载返回类型

Swift 使用类型约束泛型函数中的类型重载返回类型,swift,generics,Swift,Generics,我试图通过返回类型重载函数。返回类型来自另一个泛型函数的类型约束 我认为协议约束将允许满足所有情况(Int、String)。下面是一个可以在操场上运行的小测试用例 protocol Gettable {} extension Int: Gettable {} extension String: Gettable {} struct Test { static func get() -> Int { return 1 } static func get() ->

我试图通过返回类型重载函数。返回类型来自另一个泛型函数的类型约束

我认为协议约束将允许满足所有情况(Int、String)。下面是一个可以在操场上运行的小测试用例

protocol Gettable {}
extension Int: Gettable {}
extension String: Gettable {}

struct Test {
  static func get() -> Int {
    return 1
  }
  static func get() -> String {
    return "1"
  }
}

func getOne<T: Gettable>(_: T.Type) {
  let value: T = Test.get()
}

getOne(Int.self)
getOne(String.self)

编译器没有足够的信息来推断应该使用哪个候选函数吗?

问题是编译器不知道您已经用重载处理了所有的
Gettable

编译器在此需要的分析类型无法执行。Swift能够在运行时部署新类型,特别是用于泛型。这意味着,即使使用内部和私有协议,也不可能在编译时对一致性的详尽性进行积极测试


换句话说,不可能建立一个约束来验证是否有一个重载为符合某个协议的每个类型返回正确的类型。

Swift泛型不是这样工作的;比较一下。默认情况下,编译器不会为用于满足泛型函数占位符的每一组类型发出专门的实现。
Test.get
的重载解析发生在
getOne
本身内部。因此,编译器对
T
唯一了解的是,它被限制为
Gettable
,这无助于它在
String
Int
之间进行选择。我应该如何设计问题中的一段代码来解决这个问题@哈米什
error: test.playground:11:23: error: no 'get' candidates produce the expected contextual result type 'T'
  let value: T = Test.get()
                      ^

test.playground:11:23: note: overloads for 'get' exist with these result types: Int, String
  let value: T = Test.get()
                      ^