Method Dispatch в Swift (и не только) - Mad Brains Техно 5.07.19

  Рет қаралды 10,687

Mad Brains

Mad Brains

Күн бұрын

Пікірлер: 17
@АрсенийЗолотарев-б9щ
@АрсенийЗолотарев-б9щ Жыл бұрын
Отличный доклад и интересные дискуссии!
@Jeytery
@Jeytery 2 жыл бұрын
как обычно у мб лучшие доклады на важные темы
@forest-lll
@forest-lll 11 ай бұрын
Решение о том, какая диспетчеризация использовать для экстеншенов протокола, связано с производительностью и безопасностью типов в Swift. Давайте разберемся подробнее. 1. **Производительность:** - Статическая диспетчеризация обычно более эффективна с точки зрения производительности, чем динамическая диспетчеризация. При статической диспетчеризации компилятор может принять решение о том, какой метод вызывать на этапе компиляции, что позволяет избежать накладных расходов, связанных с поиском методов во время выполнения программы. 2. **Безопасность типов:** - Swift является языком с сильной типизацией, что означает, что компилятор проверяет типы во время компиляции, чтобы предотвратить ошибки во время выполнения. Использование статической диспетчеризации для экстеншенов протоколов помогает поддерживать эту сильную типизацию, поскольку компилятор может гарантировать, что методы, определенные в экстеншене протокола, будут доступны для всех типов, реализующих этот протокол. 3. **Поддержка расширений в будущем:** - Статическая диспетчеризация также облегчает добавление новых методов в протоколы в будущих версиях Swift без необходимости изменения реализации всех типов, реализующих этот протокол. Это связано с тем, что методы, добавленные в протоколы, автоматически становятся доступными для всех типов, реализующих эти протоколы. Хотя динамическая диспетчеризация имеет свои преимущества, такие как возможность переопределения методов в подклассах и динамическая загрузка классов во время выполнения, для экстеншенов протоколов статическая диспетчеризация обычно более предпочтительна в контексте Swift из-за упомянутых выше причин.
@nikitababonov9659
@nikitababonov9659 3 жыл бұрын
final проставляется автоматически в момент компиляции только, если включен флаг whole module optimization, надо было уточнить)
@MadBrains
@MadBrains 3 жыл бұрын
Да, все верно) Не помню уже, почему не упомянул это
@Jeytery
@Jeytery 2 жыл бұрын
если я правильно понял и для методов класса и для самих классов, от которых никто не наследовался?
@mak_whisk
@mak_whisk 3 жыл бұрын
Спасибо
@ЕгорБаранов-ы6ш
@ЕгорБаранов-ы6ш 2 жыл бұрын
Шикарно, лайк
@Ko4An1983
@Ko4An1983 5 жыл бұрын
Отличное видео! А можно ли где-нибудь скачать саму презентацию?
@MadBrains
@MadBrains 5 жыл бұрын
Да, без проблем, в обмен на лайк и репост ;)
@antolSergeich
@antolSergeich 4 жыл бұрын
@George Ymydykov docs.google.com/presentation/d/1uqG-iIpoPPpKr1GeK-R7e9dXnhSYgtiZsk7AqwtYsCQ/edit?usp=sharing
@antolSergeich
@antolSergeich 4 жыл бұрын
docs.google.com/presentation/d/1uqG-iIpoPPpKr1GeK-R7e9dXnhSYgtiZsk7AqwtYsCQ/edit?usp=sharing
@vadimorlov4986
@vadimorlov4986 3 жыл бұрын
@@MadBrains ребят, помогите плиз разобраться, не могу найти объяснение, почему final func someMethod() {} будет диспатчится статически? ведь мы можем спокойно вызвать override final func viewWillLayoutSubviews() { super.... } и при этом Свифт пойдет в суперы искать первую реализацию. То есть если в final классе нет сабклассов или функция override final func, то класс все еще может иметь родителей, а функция может брать поведения super. Разве Свифт не динамически побежит по таблице к суперам?
@hahaha9067
@hahaha9067 4 жыл бұрын
если я все правильно понимаю, то в табличку на 19:02 можно добавить третий столбец: Initial Declaration AND Extension, в которой будут 3 прочерка (у структур, классов и NSObject такое невозможно), и Table у протоколов. Тогда она станет исчерпывающей)
@MadBrains
@MadBrains 4 жыл бұрын
Да, идея верная. Но тут скорее взаимное исключение, чем отдельный случай. Если есть определение в протоколе, то будет использоваться Table и в общем-то дальше не важно что в Extension делается
@hahaha9067
@hahaha9067 4 жыл бұрын
​@@MadBrains я понял вашу логику, с ней тоже можно согласиться. Но вот что интересно: оказывается, компилятор позволяет сделать то же самое (объявить метод в Initial Declaration и Extension одновременно) и для наследников NSObject, тем самым позволяя фактически переопределять методы, не наследуясь, а лишь расширяясь. Что прямо противоречит оф докам по языку свифт. И здравому смыслу, есличес. Поэтому я настаиваю на дополнительном столбце:) в нем слишком много интересного и противоречивого
@hashcat5721
@hashcat5721 Жыл бұрын
20:03 возможно не доступно override так как super.walk вы не вызовите , а без этого нарушение правил Барбары Лисков
My scorpion was taken away from me 😢
00:55
TyphoonFast 5
Рет қаралды 2,7 МЛН
Sigma Kid Mistake #funny #sigma
00:17
CRAZY GREAPA
Рет қаралды 30 МЛН
Method Dispatch - Диспетчеризация методов в Swift
26:11
Элина про iOS
Рет қаралды 10 М.
Илья Чикмарев - async/await в Swift
29:19
CocoaHeads
Рет қаралды 11 М.
Swift. Methods Dispatch.
44:17
Программирование - интерес жизни
Рет қаралды 1,7 М.