Sobes.tech
Junior — Middle

Как е реализирана диспетчеризацията на методите, добавени чрез Extension към протоколи?

sobes.tech AI

Отговор от AI

Методите, добавени чрез разширение в протоколите на Swift, са реализирани с помощта на статично разпределение. Това означава, че извикването на такива методи се определя по време на компилация, а не по време на изпълнение. За разлика от методите, директно обявени в протокола (които използват динамично разпределение чрез таблицата на виртуалните методи), методите от разширения не могат да бъдат презаписвани в конкретни типове и се извикват директно по тип, известен по време на компилация.

Например, ако имате протокол и разширение с метод, а след това тип, който реализира този протокол, извикването на метода от разширението винаги ще използва реализацията от разширението, дори ако типът реализира метод с същото име. Това е свързано с факта, че разширенията не добавят методи към таблицата за виртуални извиквания на протокола.

protocol MyProtocol {}

extension MyProtocol {
    func greet() {
        print("Здравей от разширението")
    }
}

struct MyStruct: MyProtocol {
    func greet() {
        print("Здравей от MyStruct")
    }
}

let obj: MyProtocol = MyStruct()
obj.greet() // Ще изведе: Здравей от разширението

let obj2 = MyStruct()
obj2.greet() // Ще изведе: Здравей от MyStruct

Затова методите от разширения на протоколи се извикват статично, което е важно да се вземе предвид при проектирането на архитектурата.