TGViewer
Android в тесте и маленький капучино Android в тесте и маленький капучино @mobile_cappuccino · 496 subscribers
Post #141 601
В песочнице для iOS мы выбрали немного другую механику. Там мы делали песочницу уже после Android, так что был взгляд со стороны, что хорошо и что плохо. В итоге получилось похоже, но со своими отличиями 👁

И пока андроидик отдыхает после рассказа, к доске подходит иосик

iOS: Макросы + Build Tool Plugin
🦾

Был выбран путь сделать полностью контролируемую песочницу, где каждый параметр компонента должен быть отмечен и задан явно

Основная идея такая же — компонент отмечается макросом Playground
@attached(peer, names: suffixed(_Playground))
public macro Playground(
_ name: String,
in location: CatalogPath,
status: ComponentStatus = .active,
presentation: PlaygroundPresentation = .page,
previewLayout: PlaygroundPreviewLayout = .sizeThatFits,
designVersion: String = "1.0"
) = #externalMacro(
module: "PlaygroundMacroPlugin",
type: "PlaygroundMacro"
)


Но различие в том, как и какие параметры попадают в плейграунд

Механика плейграунда на iOS такая:

1. Пометить компонент макросом @Playground

2. Если у компонента есть параметры — разметить ВСЕ поля его модели @PlaygroundParam либо @PlaygroundIgnore. За полноту разметки отдельно следит CI-линтер.

3. Макрос разворачивается компилятором в отдельный тип PlaygroundComponent с методом component(knobs:), который возвращает View — аналог PlaygroundProvider на Android

4. На этапе сборки Build Tool Plugin сканирует swift файлы, запускает кодогенератор и на выходе получает манифест модуля PlaygroundManifest со списком всех найденных компонентов.

5. При открытии песочницы, содержимое манифеста регистрируется в singleton реестре. Он оборачивает фабрику View компонента в экранный контейнер, готовый для отображения в плейграунде.

Итого на песочнице iOS:
⭕ Компоненты строго типизированы и вероятность райнтайм крашей минимальна
⭕ Для каждого параметра явно задается своё default значение рядом с местом объявления. Видно прямо в коде компонента, а не в отдельном файле
⭕ Для компонента можно даже создать "фабрику стейтов", которая нарисует переключатель стейтов в песочнице. Удобно, чтобы проверять полноценные пресеты
⭕ Про забытые поля напомнит линтер в CI, но решение всё равно за человеком
⏺ Каждый компонент нужно явно декларировать вместе со всеми параметрами. Когда добавляется новый параметр, то надо провести анализ, какое ему значение надо поставить или поставить Ignore
⏺ Разметка для песочницы живёт в проде, рядом с боевым кодом компонента

Ну и получается, что если в Android подход больше про "магию", то в iOS — больше про "контроль". Не знаю, хорошо или плохо это... Ответ мы еще не нашли

А что думаете вы? Какой метод показался более логичным и надежным? Делитесь мыслями ⬛
  • 👍 7
  • ❤ 2
More from @mobile_cappuccino
  1. Sep 11, 2026Сделали себе публичный дашборд проекта Drinkit Пока что только для Android. Скоро сделаем…
  2. Sep 9, 2026#видеозаписи #МобильныйВторник Долгое время Shared-анимации воспринимались как красивое до…
  3. Sep 9, 2026Так был погружен в рабочие задачи, что не заметил, как неделю назад опубликовали мой докла…
  4. Sep 7, 2026Кстати, есть еще одна очень срочная и горячая новость В Додо появились стажировки! И с под…
  5. Sep 3, 2026Ура! У нас в додо наконец то открылись вакансии для Android разработчиков 👩‍💻🍕 Android…
  6. Aug 26, 2026Наткнулся в LinkedIn на вакансию, а на её странице висит системный промпт для отбора и отс…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →