我正在Swift中编写一个iOS应用程序,我正在试图弄清楚如何将项目组织成单独的模块。我正在使用MVVM架构,我想让Model,ViewModel和View组件分开Swift模块,这些模块只能使导入它们的模块可以访问它们自己的子集。 View中的文件将导入ViewModel,ViewModel中的文件将导入Model。我怎么能做到这一点?请注意,我不是要创建多个应用程序可以共享的库。我只是想使用模块强制分离组件。
编辑:也许问题是,“我应该使用什么机制来创建模块,而不是初始iOS应用程序项目附带的模块?”
“如何在Swift中使用命名空间?”中的一个答案。 https://stackoverflow.com/a/24032860/215400说,“类(等)是由它们所在的模块(Xcode目标)隐式确定的。”由此可以得出结论,目标对应于模块,答案是在Xcode项目中创建单独的目标,但我之前尝试过,而tskulbru说我需要多个Xcode项目。
关于多个Xcode项目,文件>新>项目> iOS Framework&图书馆> Cocoa Touch Framework选项看起来不正确,因为它应该用于使用UIKit的东西,我想要创建的两个模块不应该依赖于UIKit。另一个“框架和库”选项,Cocoa Touch静态库,不是Swift的选项。
使用私有Pod提到的另一个StackOverflow帖子。在花了一个小时研究之后,我得出结论认为这不是正确的解决方案,因为我不必在不同的工作空间中编辑这些模块。
答案 0 :(得分:5)
如果不为要创建的模块创建单独的项目,则无法进行此操作。这是因为Swift处理命名空间的方式。
Eonil对我的回答比我好:https://stackoverflow.com/a/24032860/215400 (复制如下)
Apple dev forum中的 SevenTenEleven 回答:
命名空间不是每个文件;他们是每个目标(基于 "产品模块名称"建立设置)。所以你最终会得到一些东西 像这样:
import FrameworkA import FrameworkB FrameworkA.foo()
所有Swift声明都被认为是其中的一部分 一些模块,所以即使你说" NSLog" (是的,它仍然存在) 你得到了斯威夫特的想法" Foundation.NSLog"。
Chris Lattner tweeted about namespacing。
命名空间隐含在swift中,所有类(等)都是隐式的 由它们所在的模块(Xcode目标)限定。没有类前缀 需要
答案 1 :(得分:1)
从我的角度来看,如果你想封装你的组件,可能你有两个解决方案:
这两个解决方案都将为您提供完全封装的模块,您可以通过public
关键字定义项目中可用的API。
您的核心项目中将看不到所有其他内容。
管理项目会花费你更多的时间,但如果你使用SOLID原则编写,可能会获得更多可重用的代码,并且可以使用import
定义将这些框架导入到其他项目中。