如何在Swift中创建可导入模块?


75

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

语法中有对import语句的引用,但是找不到有关它做什么或如何使用的信息。

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


11
题外话?认真吗 目前尚无快速可用模块的已知资源。其他人发现信息非常有价值。这不是主观的,因为还不存在!
Brett Ryan 2014年

最近,我发现了一些如何使用Swift Compiler-搜索路径(Xcode 6构建设置)将模块(C,C ++)导入Swift的发现。希望能帮助到你。
vladof81

Answers:


-1

更新资料

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

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

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

有关访问控制级别的更多信息,请点击此处


最新的Xcode 6 beta更新(beta 4)使访问控制迅捷

Swift启用访问控制

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

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

32
这个答案如何帮助某人在Swift中创建可导入模块?
安德鲁·保罗·西蒙斯

项目的框架化将降低启动性能。每个框架都需要时间加载。
凯琳18'Aug

是的,动态链接会减慢应用程序的启动速度。苹果公司提出了6个动态框架的门槛。但是在Xcode 9中,您可以更改到Mach-O Type中的静态库的链接,以解决启动问题。有关更多信息,请访问developer.apple.com/videos/play/wwdc2016/406
Clement Prem,

25

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

当前尚无方法声明公共/受保护的方法或属性。如果您希望将此功能添加为功能,可以在Apple的错误报告程序上提出功能请求。还应注意,Apple已声明该语言可能随Xcode的每个发行版而更改,因此有可能在公开发行版之前添加成员访问级别。


1
感谢您的回答。我从主旨演讲中得知,Swift正在解决的ObjC主要问题之一是使用名称空间对代码进行模块化的能力。我确信他们打算引用除了为每个模块创建框架以外的其他内容-这会产生大量开销,并且不支持模块的层次结构。老实说,这感觉就像是被赶到市场未完成。我敢肯定,其中一些功能将很快添加,这可能值得我们开发人员在使用之前等待几个版本。
短跑选手2014年

1
是的,我问过同样的事情,工程师说这是他们要求最多的功能之一。因此,这肯定在他们的雷达上
奥斯丁

现在,您可以通过使用成员类来创建类。我知道它不是同一件事,但是它的功能几乎相同。
o.uinn 2014年

8

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

如果您看一下,xcrun swift -help可能会看到一些选择,并且有-emit-module-emit-library并且-emit-object可能有用,但是,也许,您应该更喜欢官方方式并通过Framework分发模块。

如果您仍然想自己制作模块,则可以阅读本指南并附上一些说明


很好的信息。也可以不使用Xcode或REPL进行链接。虽然很怪异,但无法swiftmodule使用--sdk iphoneos
vladof81

您可以使用SWM(快速模块)创建可导入的.swiftmodule二进制文件– github.com/jankuca/swm
JK

-2

苹果公司提到私有方法尚不存在,但正在实施中。请记住,这是一门新生的语言,并且仍在发展中。


1
这个问题对私人访问没有任何要求。
凯文

-4

迅捷4.0

Apple书“ Swift编程语言(Swift 4版) ”中“访问控制”一章的描述

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

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

该答案中的信息已在接受的答案中解决(请参见此处的链接)
ReinstateMonica3167040
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.