Инкапсуляция и предварительные версии SwiftUI - PullRequest
0 голосов
/ 06 мая 2020

Фон

У меня есть приложение SwiftUI, которое взаимодействует с API моего сервера, и я выделил весь клиентский код API в его собственную структуру.

Пытаясь иметь хорошую практику инкапсуляции, я сделал большую часть инициализаторов для типов моделей API internal.

Например, тип User имеет инициализатор internal, чтобы он может быть создан только в результате вызова API, который выбирает пользователей (это очень простой пример, но есть и менее очевидные объекты).

Проблема:

Проблема в том, что многие из моих представлений SwiftUI либо принимают модальный тип API в качестве параметра, либо как @EnvironmentObject. Это прекрасно работает, за исключением написания классов предварительного просмотра, поскольку я не могу инициализировать объекты этого типа.

Я вижу три решения:

  1. Сделайте инициализаторы public. При этом теряются преимущества инкапсуляции и безопасности, но его проще всего реализовать.
  2. Сделайте каждый предварительный просмотр с помощью вызова API. Это дает преимущество сохранения инкапсуляции как есть, но требует большого количества кода, замедляет предварительный просмотр и делает предварительный просмотр зависимым от соединения inte rnet.
  3. Создайте файл в структуре API, который предоставляет пример объекта каждого типа. Хотя это вводит дополнительный код, он позволяет мне сохранять инкапсуляцию и иметь динамический c, быстрый предварительный просмотр.

Что было бы лучшим решением? Или есть способ предоставить доступ к предварительному просмотру для internal типов, например, как друг работает на C ++?

...