DevPrep

Все темы › Современный Swift

Witness table vs vtable — в чём разница?

Senior PRO

Суть

Обе — таблицы указателей на функции, через которые идёт табличная диспетчеризация, но отвечают они на разные вопросы:

protocol Shape { func area() -> Double }
struct Circle: Shape {
    let r: Double
    func area() -> Double { .pi * r * r }
}
class Animal { func sound() -> String { "..." } }
class Dog: Animal { override func sound() -> String { "Woof" } }

func areaGeneric<S: Shape>(_ s: S) -> Double { s.area() }
func areaExistential(_ s: any Shape) -> Double { s.area() }

let pet: Animal = Dog()
_ = pet.sound()                        // vtable класса Dog
_ = areaGeneric(Circle(r: 1))          // witness table (или специализация)
_ = areaExistential(Circle(r: 1))      // existential → witness table

Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.

Полный ответ — в DevPrep

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store