Swift泛型-调用哪个方法?

Swift泛型-调用哪个方法?,swift,generics,Swift,Generics,假设以下玩具示例: protocol AwesomeType: Equatable { var thingy: Int { get } } extension Array where Element: Equatable { func doThing { ... } } extension Array where Element: AwesomeType { func doThing { ... } } extension String: AwesomeTyp

假设以下玩具示例:

protocol AwesomeType: Equatable {
     var thingy: Int { get }
}

extension Array where Element: Equatable {

    func doThing { ... }
}

extension Array where Element: AwesomeType {

    func doThing { ... }
}

extension String: AwesomeType {

    var thingy: Int { return 42 }
}
如果我有一个
String
s-
[“Foo”、“Bar”、“Baz”]
-数组,并且我在其上调用
doThing()
,将调用哪个实现?为什么?

我相信这是在编译时确定的;换句话说,这不是一个动态调度。但如何确定呢?这感觉上类似于协议扩展的规则,但这是一种动态调度情况…

它会产生一个

错误:“doThing()”的用法不明确

使用简单修改的示例:

protocol AwesomeType: Equatable { }

extension Array where Element: Equatable {
    func doThing() { print("array one") }
}

extension Array where Element: AwesomeType {
    func doThing() { print("array two") }
}

extension String: AwesomeType { }

let arr = [ "Foo", "Bar", "Baz" ]

arr.doThing()
编译器抱怨

错误:“doThing()”的用法不明确

注意:找到此候选人
func doThing(){print(“数组一”)}

注意:找到此候选人
func doThing(){print(“数组二”)}

编译器根本不知道调用哪个方法,因为这两个方法具有相同的名称和参数


如果有多个方法命名相同,但实际上并不相关,那么当这两个方法最终在某一点上重叠时,总是会带来一些编译器问题的风险。

AwesomeType
是比
equalable
更具体的类型,因为它扩展了
equalable
,所以我希望它“获胜”。你们试过了吗?我希望编译器会在退化的候选者上让步并出错。(当我没有真正考虑添加
=
函数时,我做了一段时间)。我期望得到这样的结果:“错误:'doThing()'的模糊用法”是在编译时确定的。是的,这是正确的。我过度简化了我正在处理的更复杂问题的代码。(哦!)