Back to questions
Junior — Middle
85
Какой механизм диспетчеризации применяется при вызове метода, определенного в протоколе, который был расширен при помощи Extension?
Answer from AI
sobes.tech AI
В Swift, если метод определён в протоколе, а затем протокол расширен через Extension с реализацией этого метода, то при вызове метода через ссылку на протокол используется статическая диспетчеризация (static dispatch). Это означает, что вызов метода будет направлен на реализацию из расширения протокола, а не на реализацию в конкретном типе, даже если тип её переопределяет.
Другими словами, методы, реализованные в расширениях протоколов, не поддерживают динамическую диспетчеризацию (dynamic dispatch), в отличие от обязательных методов протокола, реализованных в типах.
Пример:
protocol MyProtocol {
func requiredMethod()
}
extension MyProtocol {
func requiredMethod() {
print("Default implementation in extension")
}
}
struct MyStruct: MyProtocol {
func requiredMethod() {
print("Implementation in MyStruct")
}
}
let instance: MyProtocol = MyStruct()
instance.requiredMethod() // Выведет "Default implementation in extension"
Это связано с тем, что методы из расширений протоколов не входят в таблицу виртуальных вызовов (vtable) и вызываются напрямую.