我该如何在Swift中创建一个可导入的模块?

78

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

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

是否有人知道在哪里可以找到这些信息?


12
离题了?真的吗?目前没有已知的关于Swift模块的资源,这对于需要帮助的人来说非常有价值。这并不是主观的,因为目前还没有任何东西存在!请问需要翻译其他内容吗? - Brett Ryan
最近我发现了一些关于如何使用 Swift 编译器 - 搜索路径(Xcode 6 构建设置)将模块(C、C++)导入到 Swift 中的方法。希望这能有所帮助。 - vladof81
5个回答

26

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

目前还没有办法声明方法或属性为public / protected。如果您想将其添加为功能,请在Apple的错误报告者上提出请求。应注意,苹果已经表示语言可能会在每个Xcode版本发布时更改,因此成员访问级别在公开发布之前可能会被添加。


1
谢谢你的回答。我从主题演讲中了解到,ObjC面临的主要问题之一是通过使用命名空间来模块化代码的能力,而Swift正在解决这个问题。我相信他们打算将其用于创建每个模块的框架以外的其他内容 - 这将产生很多开销,并且不支持模块的层次结构。老实说,这感觉像是匆忙上市的未完成品。我相信其中一些功能将很快被添加,对于我们开发人员来说,在使用它之前等待几个版本可能是值得的。 - sprinter
1
是的,我曾经问过这个问题,工程师说这是他们最受欢迎的功能之一。所以它肯定在他们的关注范围内。 - Austin
1
现在你可以通过创建一个带有成员类的类来实现这一点。我知道这不是同一件事,但它的功能方式非常相似。 - o.uinn

8

同时,你也可以自己制作一个模块,但这是一种更加困难的方法。

如果你查看xcrun swift -help,你会看到几个选项,其中有-emit-module-emit-library-emit-object这些可能有用的选项,但是,最好还是采用官方方式通过框架来分发模块。

如果你仍然想要自己制作模块,你可以阅读这篇指南,里面有一些解释。


不错的信息。这也可以在没有Xcode或REPL的情况下链接。虽然无法使用“--sdk iphoneos”制作swiftmodule,但这很奇怪。 - vladof81
您可以使用SWM(Swift模块)创建可导入的.swiftmodule二进制文件 - http://github.com/jankuca/swm - J. K.

-2

苹果提到私有方法目前还不存在,但正在实现中。请记住,这是一种新生语言,仍在不断完善中。


2
这个问题并没有询问任何关于私有访问的内容。 - Kevin

-3

更新

你可以使用框架来模块化 Swift 项目。

我们通过为每个模块创建单独的框架项目,并通过 Xcode 工作区将它们链接起来来进行模块化。将组件分成不同的项目看起来更自然,也确保模块之间只有单向通信。开发人员可以在隔离的环境中工作/测试,而不必过多考虑其他模块。

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

有关访问控制级别的更多信息,请参见 这里


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

Swift启用访问控制

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

  • private实体只能从定义它们的源文件中访问。
  • internal实体可以在定义它们的目标内的任何地方访问。
  • public实体可以从目标内的任何地方以及从导入当前目标模块的任何其他上下文中访问。

33
这个回答如何帮助某人在Swift中创建可导入的模块? - Andrew Paul Simmons
项目的框架化将降低启动性能。每个框架需要加载时间。 - kelin
是的,动态链接会减慢应用程序的启动速度。苹果建议使用6个动态框架的阈值。 但在Xcode 9中,您可以将链接更改为静态库以解决启动问题。有关更多信息,请访问https://developer.apple.com/videos/play/wwdc2016/406/。 - Clement Prem

-4

Swift 4.0

来自苹果书籍 "The Swift Programming Language (Swift 4 Edition)" 章节 "访问控制" 的描述

Swift 提供了五种不同的访问级别来管理代码中的实体。这些访问级别是相对于定义实体的源文件以及该源文件所属的模块而言的。 open 访问和 public 访问使得实体可以在定义它们的模块内的任何源文件中使用,也可以在导入定义模块的另一个模块的源文件中使用。通常在指定框架的公共接口时使用 open 或 public 访问。open 和 public 访问之间的区别在于,open 访问还允许其他模块继承和重写实体。 internal 访问使得实体可以在定义它们的模块内的任何源文件中使用,但不能在该模块外的任何源文件中使用。通常在定义应用程序或框架的内部结构时使用 internal 访问。 fileprivate 访问将实体的使用限制在其自己定义的源文件中。当某个功能的实现细节在整个文件中都被使用时,可以使用 file-private 访问来隐藏这些细节。 private 访问将实体的使用限制在封闭声明及其在同一文件中的扩展中。当某个功能的实现细节仅在单个声明中使用时,可以使用 private 访问来隐藏这些细节。

此答案中的信息已在被接受的答案中得到解决(请参见链接)。 - ReinstateMonica3167040

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接