我正在Swift中编写一个iOS应用程序,我正在试图弄清楚如何将项目组织成单独的模块.我正在使用MVVM架构,我想让Model,ViewModel和View组件分开Swift模块,这些模块只能使导入它们的模块可以访问它们自己的子集.View中的文件将导入ViewModel,ViewModel中的文件将导入Model.我怎么能做到这一点?请注意,我不是要创建多个应用程序可以共享的库.我只是想使用模块强制分离组件.
编辑:也许问题是,"我应该使用什么机制来创建模块,而不是初始iOS应用程序项目附带的模块?"
"如何在Swift中使用命名空间?"中的答案之一 /sf/ask/17360801/说,"类(等)是由它们所在的模块(Xcode目标)隐式确定的." 由此可以得出结论,目标对应于模块,答案是在Xcode项目中创建单独的目标,但我之前尝试过,而tskulbru说我需要多个Xcode项目.
关于多个Xcode项目,文件>新建>项目> iOS框架和库> Cocoa Touch Framework选项看起来不正确,因为它应该用于使用UIKit的东西,我想要创建的两个模块不应该依赖在UIKit上.另一个"框架和库"选项,Cocoa Touch静态库,不是Swift的选项.
使用私有Pod提到的另一个StackOverflow帖子.花了一个小时研究之后,我得出结论认为这不是正确的解决方案,因为我不应该在不同的工作空间中编辑这些模块.
如果不为要创建的模块创建单独的项目,则无法做到这一点.这是因为Swift处理命名空间的方式.
Eonil对我的回答比我好:https://stackoverflow.com/a/24032860/215400 (下面复制)
SevenTenEleven在Apple开发论坛上的回答:
命名空间不是每个文件; 它们是每个目标(基于"产品模块名称"构建设置).所以你最终得到这样的东西:
import FrameworkA import FrameworkB FrameworkA.foo()所有Swift声明都被认为是某个模块的一部分,所以即使你说"NSLog"(是的,它仍然存在),你也会得到Swift认为的"Foundation.NSLog".
克里斯拉特纳也发布了关于命名空间的推文.
命名空间是迅速隐式的,所有的类(ETC)由模块(Xcode目标)都隐含作用域他们英寸不需要类的前缀