假设以下玩具示例:
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
数组 - [ "Foo", "Bar", "Baz"]
- 我调用 doThing()
上面,将调用哪个实现?为什么?
我相信这是在编译时确定的;换句话说,它不是动态调度。但它是如何确定的呢?感觉它类似于协议(protocol)扩展的规则,但这是动态调度情况......
最佳答案
它产生一个
error: ambiguous use of '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()
编译器报错
error: ambiguous use of 'doThing()'
note: found this candidate
func doThing() { print("array one") }note: found this candidate
func doThing() { print("array two") }
编译器根本不知道调用哪一个,因为这两个方法具有相同的名称和参数。
当两个方法最终在某个点重叠时,具有多个名称相同但实际上并不相关的方法总是会带来一些编译器问题的风险。
关于Swift Generics - 调用哪个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35372540/