假设以下玩具示例:
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 }
}
Run Code Online (Sandbox Code Playgroud)
如果我有一个Strings - 的数组[ "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()
Run Code Online (Sandbox Code Playgroud)
编译器抱怨
错误:模糊地使用'doThing()'
注意:找到这个候选
函数doThing(){print("array one")}注意:找到这个候选
函数doThing(){print("array two")}
编译器根本不知道调用哪一个,因为这两个方法具有相同的名称和参数.
具有相同但实际上不相关的多个方法总是会导致一些编译器问题的风险,当这两个方法最终在某个时刻重叠时.