Method dispatch
Про то, как устроена диспетчеризация методов в Swift написано не мало, поэтому я не хочу повторяться в пересказе. Детально погрузиться или повторить все аспекты, предлагаю за просмотром видео Swift Mehtod Dispatch. Статей, где подробно объясняется зачем и почему в Swift сосуществуют различные типы нахождения и вызовов методом предостаточно, например, вот. Вообще говоря, большого прикладного применения я в этом не вижу, но понимать базово все же стоит.
Разберем несколько "tricky" примеров-вопросов с собеседований, которые могут действительно застать врасплох.
На первом скрине, у нас есть вызов метода сначала у структуры, а затем у структуры приведенной к протоколу. В случае если метод определен только в расширении протокола, мы получим ответы:
// In Struct
// In Protocol
Будет использована Static dispatch для метода из расширения протокола.
Если же мы добавим метод и в объявление протокола, то будет применен Witness table (скрин 2) и ответ станет:
// In Struct
// In Struct
На третьем скрине ситуация посложнее. Метод определен в протоколе и в его расширении. Есть класс B, который реализует протокол, но не перегружает метод из него. И есть класс С потомок класса B и переопределенный метод из протокола P. При вызове метода у класса С приведенного к протоколу, логично предполагать, что будет вызван переопределенный метод из класса С, но мы получаем вызов метода из расширения протокола 🤯.
Баг открыт много лет и пока не был поправлен. Собственно, как можно его закостылись смотреть там же)
#ios #swift #interview
Post #99
2.4K



- 🔥 7
- 👍 4
- 👏 2
- 🤡 2