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

时间:2016-07-12 15:04:08

标签: swift polymorphism method-dispatch

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的任何内容,以及任意数量的其他协议,因此如果对象的结构也使用v-table,Swift运行时如何知道它的结构? ?

1 个答案:

答案 0 :(得分:3)

Swift运行时使用Protocol Witness Table,它保存了指向每种类型协议方法实现的指针。

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

  

最后一个,在偏移32处是一个"协议见证表"对于底层类型和协议,它包含指向协议方法的类型实现的指针。这就是编译器如何在协议类型的值上调用方法(如p())而不知道运行时的基础类型。

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