将Swift应用程序的组件划分为Swift模块

时间:2016-01-01 18:48:43

标签: xcode swift mvvm module

我正在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帖子。在花了一个小时研究之后,我得出结论认为这不是正确的解决方案,因为我不必在不同的工作空间中编辑这些模块。

2 个答案:

答案 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)

从我的角度来看,如果你想封装你的组件,可能你有两个解决方案:

  • 框架
  • 内部cocoapods

这两个解决方案都将为您提供完全封装的模块,您可以通过public关键字定义项目中可用的API。 您的核心项目中将看不到所有其他内容。

管理项目会花费你更多的时间,但如果你使用SOLID原则编写,可能会获得更多可重用的代码,并且可以使用import定义将这些框架导入到其他项目中。