【问题标题】:At runtime, how does Swift know which implementation to use?在运行时,Swift 如何知道要使用哪个实现?
【发布时间】:2016-11-14 21:59:09
【问题描述】:
protocol A {
    func f()
}

struct S1 : A {
    func f() {
        print("S1")
    }
}

struct S2 : A {
    func f() {
        print("S2")
    }
}

let array: [A] = [S1(), S2()]

for s: A in array {
    s.f()
}

// "S1\n" "S2\n"

如果这是一个继承层次结构,我希望 Swift 使用 v-table 来查找正确的实现。但是,array 中的具体类型可以是任何实现了A 的类型以及任意数量的其他协议,那么如果 Swift 运行时也使用 v-tables,它如何知道对象的结构呢?

【问题讨论】:

  • Swift 使用“协议见证表”来做到这一点——这个 WWDC 演讲很好地解释了这一点:developer.apple.com/videos/play/wwdc2016-416/?time=1474
  • 太棒了,有趣的是,我今天已经打算看那个视频了。 :)
  • 正要回复,但是,是的,看那个谈话:)

标签: swift polymorphism method-dispatch


【解决方案1】:

Swift 运行时使用一个 Protocol Witness Table,它包含指向每个类型的协议方法实现的指针。

Mike Ash 在他的文章 Exploring Swift Memory Layout, Part II 中解释得最好:

最后一个,在偏移量 32 处是底层类型和协议的“协议见证表”,其中包含指向协议方法的类型实现的指针。这就是编译器能够在运行时不知道底层类型的情况下对协议类型的值调用方法(例如 p())的方式。

我还会按照 Hamish 在 cmets 中的建议观看 WWDC 视频 Understanding Swift Performance

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2010-09-17
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多