【发布时间】:2016-04-06 03:59:05
【问题描述】:
我正在用 Swift 编写一个 iOS 应用程序,并试图弄清楚如何将项目组织成单独的模块。我正在使用 MVVM 架构,我想让 Model、ViewModel 和 View 组件分离 Swift 模块,使导入它们的模块只能访问它们自身的子集。 View 中的文件将导入 ViewModel,而 ViewModel 中的文件将导入 Model。我怎样才能做到这一点?请注意,我并不是要创建多个应用程序可以共享的库。我只是想使用模块来强制分离组件。
编辑:也许问题是,“除了最初的 iOS 应用程序项目附带的模块之外,我应该使用什么机制来创建模块?”
“如何在 Swift 中使用命名空间?”中的一个答案https://stackoverflow.com/a/24032860/215400 说,“类(等)由它们所在的模块(Xcode 目标)隐式限定。”由此,人们可能会得出结论,目标对应于模块,答案是在 Xcode 项目中创建单独的目标,但我之前尝试过,tskulbru 说我需要多个 Xcode 项目。
关于多个 Xcode 项目,File > New > Project > iOS Framework & Library > Cocoa Touch Framework 选项看起来不正确,因为它应该用于使用 UIKit 的东西,而我要创建的两个模块应该'不依赖于 UIKit。另一个“框架和库”选项 Cocoa Touch 静态库不是 Swift 的选项。
另一个 StackOverflow 帖子提到使用私有 Pod。在花了一个小时研究之后,我得出结论认为这不是正确的解决方案,因为我不应该在不同的工作区编辑这些模块。
【问题讨论】:
-
为什么不使用
private限定符来强制封装? -
@Marc--谢谢,但将内容设为对它们定义的文件的私有不是我想要的。 Modules 提供的公共访问与内部访问 (developer.apple.com/library/ios/documentation/Swift/Conceptual/…) 正是我想要的。
-
@ChristopherSimmons “Cocoa Touch 框架”这个名称具有误导性,苹果可能出于市场原因选择了该名称。真的,它应该被称为“达尔文框架”或类似的东西。 “Cocoa Touch 框架”真正构建的是一个封装在
….framework中的动态共享库——它可以依赖于 UIKit 或 AppKit 或 Foundation 或 CoreFoundation 或任何其他框架,甚至没有依赖关系(仅依赖于 std /system C API)。要使其不依赖于 UIKit,请进入项目设置并将 Linked Frameworks 中的UIKit.framework替换为Foundation.framework。