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

时间:2017-09-07 19:58:48

标签: swift generics

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

我认为协议约束将允许所有情况(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)

这会产生以下错误

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()
                      ^

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

1 个答案:

答案 0 :(得分:1)

问题在于,编译器不知道您已经解决了Gettable的每个重载问题。

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

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