Разделение компонентов приложения Swift на модули Swift
Я пишу приложение iOS в Swift, и я пытаюсь выяснить, как организовать проект в отдельные модули. Я использую архитектуру MVVM, и я хочу сделать компоненты модели, ViewModel и View отдельными модулями Swift, которые делают только подмножества доступными для модулей, которые их импортируют. Файлы в представлении импортируют ViewModel, а файлы в ViewModel импортируют модель. Как я могу это сделать? Обратите внимание, что я не пытаюсь создать библиотеки, которыми могут пользоваться несколько приложений. Я просто пытаюсь обеспечить разделение компонентов с помощью модулей.
EDIT: возможно, вопрос в том, "какой механизм я должен использовать для создания модулей, кроме того, который поставляется с первоначальным проектом приложения iOS?"
один из ответов в "как вы используете пространства имен в Swift?"https://stackoverflow.com/a/24032860/215400 говорит: "классы (etc) неявно ограничены модулем (целью Xcode), они в."Из этого можно сделать вывод, что цели соответствуют модулям и что ответ заключается в создании отдельных целей в проекте Xcode, но я пробовал это раньше, и tskulbru говорит, что мне нужно несколько проектов Xcode.
Что касается нескольких проектов Xcode, опция File > New > Project > iOS Framework & Library > Cocoa Touch Framework не выглядела правильно, потому что она должна быть для вещей, которые используют UIKit, и два модуля, которые я хочу создать, не должны зависеть от Базе UIKit. Другой вариант "Framework & Library", статическая библиотека Cocoa Touch, не является вариантом с Swift.
другой пост StackOverflow упоминается с использованием частных стручков. Потратив на это час, я пришел к выводу, что это неправильное решение, потому что мне не нужно редактировать эти модули в разных рабочих областях.
2 ответов
Это невозможно без создания отдельных проектов для модулей, которые вы хотите создать. Это связано с тем, что Swift обрабатывает пространство имен.
Eonil ответил лучше, чем я: https://stackoverflow.com/a/24032860/215400 (Копия ниже)
ответ SevenTenEleven на форум разработчиков Apple:
пространства имен не для каждого файла; они для каждой цели (на основе "Название Модуля Продукта" настройка сборки). Значит, у тебя что-то есть. вот так:
import FrameworkA import FrameworkB FrameworkA.foo()
все объявления Swift считаются частью какой-то модуль, поэтому даже когда вы говорите " NSLog "(да, он все еще существует) вы получаете то, что Свифт считает "фундаментом".NSLog".
и Крис Lattner в твиттере о пространстве имен.
пространство имен неявно в swift, все классы (etc) неявно область применения модуля (Цель Xcode) они находятся внутри. нет префиксов классов нужно
С моей точки зрения, если вы хотите, чтобы инкапсулировать свои компоненты, вероятно, у вас есть два решения:
- рамки
- внутренние cocoapods
оба решения дадут вам полностью инкапсулированные модули, где вы можете определить API, который будет доступен в project через public
ключевое слово.
Все остальное не будет видно в вашем основном проекте.
управление вашим проектом будет стоить вам намного больше времени, но если вы напишете это использование твердых принципов, вероятно, вы получите более многоразовый код, и эти рамки могут быть импортированы в другой проект только с помощью import
определение.