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: 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/

相关文章:

swift - UnsafeMutablePointer<Void> 到具体对象类型

c# - 这可能使用泛型吗? C#

generics - 使用 GHC.Generics 或 Data.Data 类型族

C#、泛型列表和继承

ios - 选项卡栏,点击 Root View Controller

ios - 如何在多个ViewController中使用NSFetchedResultsControllerDelegate而不重复 Controller 代码?

ios - 为什么在 subview 中添加 UILabel 会使其像素化

ios - 如何使我的 ReferenceWritableKeyPath 类通用

Java 泛型 - 检索类型

swift - 当我在应用程序委托(delegate)中设置根 vc 并设置 ui( Storyboard)时,为什么我的屏幕显示纯黑?