在运行时,Swift 如何知道使用哪个实现?

Ian*_*ton 8 polymorphism method-dispatch swift

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"
Run Code Online (Sandbox Code Playgroud)

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

JAL*_*JAL 11

Swift 运行时使用协议见证表,该表包含指向协议方法的每种类型实现的指针。

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

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

我还会按照 Hamish 的评论中的建议观看 WWDC 视频“了解 Swift 性能”