Вопрос проверяет понимание того, как Swift реализует протоколы и полиморфизм без наследования.
Witness table — это таблица, которая связывает конкретный тип с реализациями требований протокола. Когда тип соответствует протоколу, компилятор создаёт такую таблицу. Через неё Swift понимает, какие функции вызывать при работе с протоколом. Это основной механизм вызова методов у протоколов. Он используется вместо vtable для value-типов и протоколов.
Swift использует witness table для реализации протоколов, чтобы обеспечить полиморфизм без классового наследования. Это особенно важно для структур и перечислений.
Witness table — это таблица соответствия, которая содержит реализации всех требований протокола для конкретного типа.
Перед использованием списков важно понимать, что протокол не хранит реализацию, а только требования.
Протокол описывает, что должно быть реализовано
Конкретный тип реализует эти требования
Компилятор создаёт witness table
При вызове метода через протокол Swift обращается к этой таблице
protocol Flyable {
func fly()
}
struct Bird: Flyable {
func fly() {
print("Bird flies")
}
}
func makeFly(_ object: Flyable) {
object.fly()
}
Когда fly() вызывается через Flyable, Swift:
получает witness table для Bird
находит реализацию fly
вызывает её
Протоколы
Generics с ограничениями
Value-типы (struct, enum)
Protocol-oriented programming
vtable — для классов и наследования
witness table — для протоколов и соответствия
Witness table — ключевой механизм Swift для работы с протоколами. Его стоит понимать при проектировании архитектуры на основе протоколов и generics.