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