加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift Generics – 调用哪种方法?

发布时间:2020-12-14 04:41:26 所属栏目:百科 来源:网络整理
导读:假设以下玩具示例: protocol AwesomeType: Equatable { var thingy: Int { get }}extension Array where Element: Equatable { func doThing { ... }}extension Array where Element: AwesomeType { func doThing { ... }}extension String: AwesomeType {
假设以下玩具示例:

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 }
}

如果我有一个字符串数组 – [“Foo”,“Bar”,“Baz”] – 我在其上调用doThing(),将调用哪个实现?为什么?

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

解决方法

它会产生一个

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”) }

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

具有相同但实际上不相关的多个方法总是会导致一些编译器问题的风险,当这两个方法最终在某个时刻重叠时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读