Этот вопрос проверяет понимание методов вызова функций (диспетчеризации) и их влияния на производительность и поведение в Swift.
Диспетчеризация в Swift — это способ вызова метода или функции. Она может быть статической (Static Dispatch), когда вызов определяется на этапе компиляции, или динамической (Dynamic Dispatch), когда решение принимается во время выполнения программы.
Используется для функций и методов в структурах, перечислениях и финальных классах.
Вызов определяется на этапе компиляции, что обеспечивает высокую производительность.
Пример:
struct Animal {
func speak() {
print("Static dispatch")
}
}
let animal = Animal()
animal.speak() // Компилятор знает, какую функцию вызватьПрименяется для методов классов с полиморфизмом.
Реализуется через виртуальные таблицы (vtable).
Пример:
class Animal {
func speak() {
print("Dynamic dispatch")
}
}
class Dog: Animal {
override func speak() {
print("Woof")
}
}
let animal: Animal = Dog()
animal.speak() // Решается во время выполненияМетоды, добавленные через расширения (extension), всегда используют статическую диспетчеризацию, даже если это класс.
Пример:
class Animal {}
extension Animal {
func speak() {
print("Static extension dispatch")
}
}
let animal = Animal()
animal.speak() // Статический вызов