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

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

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

6 ответов

14 просмотров

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

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 для определений внутрий расширений, но его практически сразу убрали за полной ненадобностью, что ещё раз подчеркивает исключительно статическую натуру ретроактивной модели.

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

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

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Я вот подумал. SSE выполняет операции максимум с 64-битной точностью. А FPU - всегда с 80-битной. Разве не должно быть FPU точнее тогда?
The Bird of Hermes
13
как быть с принтером? такой подход прокатит?
zamtmn
12
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Я не понимаю, это троллинг или что? Швабрика поддерживают, который буквально пишет на ассемблере взаимодействия с винапи. Я это ещё написал загрузчик и хоть что-то изучаю в о...
Shadow Akira
6
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Карта сайта