172 похожих чатов

Почему часто делают функционал какой то через экстеншен когда можно

прямо в структуре выше написать?

6 ответов

15 просмотров

Чтобы читалось легче

Konstantin Sinchilo
нет)

Это весь ответ?)

Расширения в языке Swift обычно используется для 3х вещей: - Реализация ретроактивной модели. Ретроактивная модель наделяет язык возможностью расширять функционал Типа. Тут важно понимать, что в самом языке ретроактивная модель реализовано лишь частично, несёт в себе много ограничений и проблем. // ——— В данном контексте, расширения, позволяют добавить вычислимые св-ва, методы, сабскрипты, инициализаторы и т.д. НО не позволяют добавить хранимое св-во, что есть фундаментальное ограничение, за которым и следует исключительно статическая диспетчерезация ретроактивной модели в языке. Расширения не могут менять размер Типа с которым работают, отсюда следует невозможность добавить хранимые св-ва в рамках ретроактивной модели, как и нельзя переопределять то, что было добавлено в рамках расширения Типу, потому что это потребовало бы доступа к таблице виртуальных методов самого Типа, что ретроактивная модель пока не умеет и вряд ли когда-то будет иметь, потому что за этим следует куча проблем. // ——— Проблема ретроактивной модели(экстеншенов) в языке Swift заключается в том, что нет никаких гарантий, какая из реализаций сработает. Допустим, есть некий Тип Foo из модуля A, есть экстеншен Типа Foo в модуле B и экстеншен Типа Foo в модуле C. Для простоты в расширениях происходит реализация какого-либо одного и того же протокола. И вот ты где-то внутри у себя делаешь: import A import B import C // А какая собственно реализация протокола должна быть? Та что в B или в C. Swift не даёт тут никаких гарантий. // ——— Именно по этой причине во многих случаях сами разработчики не пользуются ретроактивной моделью. Тот же протокол Codable(Decodable) не может быть никак реализован у примитивных типов из стандартной библиотеки. Попробуй, реализовать свой Decodable у Array или у Dictionary? Казалось бы почему, ведь ретроактивная модель должна позволять это делать, но сделать это не получится, потому что протоколы содержащие инициализаторы не могу быть реализованы в рамках ретроактивной модели. - Реализация Protocol Extensions. Позволяет задавать расширение всякого типа, который реализует данный протокол. Удобная штука и довольно фундаментальная для самого языка. Даёт возможность наделить реализующую сторону нужным дефолтным функционалом. - Реализация исключительно какой-то организационной составляющей. Позволяет удобно разделять реализацию на блоки по смыслу. Разделять реализацию разных протоколов. Разделять публичный интерфейс от приватного в рамках одного Типа(помещать приватные методы в расширения, чтобы не мазолили глаза) P.S. В бородатые времена у Swift была возможность писать ключевое слово final для определений внутрий расширений, но его практически сразу убрали за полной ненадобностью, что ещё раз подчеркивает исключительно статическую натуру ретроактивной модели.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта