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()'的模糊用法”是在编译时确定的。是的,这是正确的。我过度简化了我正在处理的更复杂问题的代码。(哦!)