【问题标题】:How do I create an importable module in Swift?如何在 Swift 中创建可导入模块?
【发布时间】:2014-06-04 00:26:57
【问题描述】:

我已经阅读了 Apple 的 Swift 文档,但找不到任何关于如何创建模块或如何将类或结构成员定义为私有或公共的信息。

语法中有对 import 语句的引用,但我找不到关于它的作用或如何使用它的信息。

有人知道我在哪里可以找到这个吗?

【问题讨论】:

  • 离题?严重地?目前没有已知的 swift 模块资源,有帮助。其他人则认为信息非常有价值。这不是主观的,因为什么都不存在!
  • 我最近发现了一些关于如何使用 Swift Compiler - Search Paths(Xcode 6 构建设置)将模块(C、C++)导入 Swift 的信息。希望对您有所帮助。

标签: swift module


【解决方案1】:

在 Swift 中,“模块”指的是框架。 Xcode 现在有一个用于为 iOS 和 OS X 创建框架项目的模板。

目前没有办法将方法或属性声明为 public/protected。如果您希望将此作为功能添加,您可以在Apple's bug reporter 上提出功能请求。还应该注意的是,Apple 已经声明语言可能会随着 Xcode 的每次发布而改变,因此可能会在公开发布之前添加成员访问级别。

【讨论】:

  • 感谢您的回答。我从主题演讲中了解到,Swift 正在解决的 ObjC 中的主要问题之一是通过使用命名空间来模块化代码的能力。我敢肯定,他们打算指的是除了为每个模块创建框架之外的东西——这将是很多开销并且不支持模块的层次结构。老实说,这感觉就像它被匆匆推向市场未完成。我确信这些功能中的一些会很快被添加,并且我们的开发人员在使用它之前可能值得等待几个版本。
  • 是的,我也问过同样的问题,工程师说这是他们最需要的功能之一。所以这肯定在他们的雷达上
  • 现在你可以通过创建一个包含成员类的类来做到这一点。我知道它不是一回事,但它的功能大致相同。
【解决方案2】:

另外,有一种方法可以自己制作模块,但方法有点困难。

如果您查看xcrun swift -help,您可能会看到一些选项,其中有-emit-module-emit-library-emit-object,它们可能有用,但是,您可能应该更喜欢官方方式并分发模块通过框架。

如果你仍然想自己制作模块,你可以阅读this guide并解释一下

【讨论】:

  • 不错的信息。这也可以在没有 Xcode 或 REPL 的情况下链接。虽然使用--sdk iphoneos 无法生成swiftmodule 很奇怪。
  • 您可以使用 SWM(Swift 模块)创建可导入的 .swiftmodule 二进制文件 – github.com/jankuca/swm
【解决方案3】:

Apple 提到私有方法尚不存在,但它们正在实施中。请记住,这是一种新生语言,它仍在不断完善中。

【讨论】:

  • 这个问题没有问任何关于私人访问的问题。
【解决方案4】:

更新

您可以使用框架模块化快速项目。

我们通过为每个模块创建单独的框架项目并通过 Xcode 工作区链接它们来实现模块化。当我们将组件分成不同的项目时,它看起来更自然,并且还确保模块之间只有单向通信。开发人员可以在隔离的情况下工作/测试,而无需过多考虑其他模块。

默认情况下,在框架中创建的类/结构/等将具有internal 访问控制类型,因此它仅在模块中可见。为了使其在模块外可见,您可以将其设为public

更多关于访问控制级别的信息here


最新的 Xcode 6 beta 更新(beta 4)为 swift 带来访问控制

Swift 启用访问控制

Swift 访问控制有三个访问级别:

  • 私有实体只能从定义它们的源文件中访问。
  • 内部实体可以在定义它们的目标内的任何位置访问。!
  • public 实体可以从目标内的任何位置以及导入当前目标模块的任何其他上下文访问。

【讨论】:

  • 这个答案如何帮助某人在 Swift 中创建可导入模块?
  • 项目的框架化会降低启动性能。每个框架都需要时间来加载。
  • 是的,动态链接会减慢应用程序的启动速度。苹果建议6个动态框架的门槛。但在 Xcode 9 中,您可以更改 Mach-O 类型中静态库的链接以解决启动问题。欲了解更多信息developer.apple.com/videos/play/wwdc2016/406
【解决方案5】:

斯威夫特 4.0

Apple 书籍“The Swift Programming Language (Swift 4 Edition)”中“访问控制”一章的描述

Swift 为代码中的实体提供了五种不同的访问级别。这些访问级别与定义实体的源文件相关,也与源文件所属的模块相关。

  • open access 和public access 使实体可以在其定义模块的任何源文件中使用,也可以在导入定义模块的另一个模块的源文件中使用。在指定框架的公共接口时,您通常使用开放或公共访问。 open 和 from 另一个导入定义模块的模块之间的区别。在指定框架的公共接口时,您通常使用开放或公共访问。
  • internal 访问使实体可以在其定义模块的任何源文件中使用,但不能在该模块之外的任何源文件中使用。在定义应用程序或框架的内部结构时,您通常使用内部访问。
  • fileprivate 访问将实体的使用限制在其自己的定义源文件中。当在整个文件中使用这些细节时,使用文件私有访问来隐藏特定功能的实现细节。
  • private 访问将实体的使用限制为封闭声明,以及同一文件中该声明的扩展。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。”

【讨论】:

  • 这个答案中的信息已经在接受的答案中得到解决(见那里的链接)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2019-08-22
  • 2019-09-10
  • 2015-09-22
  • 1970-01-01
  • 2015-11-30
  • 2017-11-12
相关资源
最近更新 更多