Разделение компонентов приложения 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 определение.