为了回答您的问题,出于调试目的,您实际上可以使用它。假设您有一个工作空间MyAwesomeWkspace
和里面的一个项目MyAwesomeProject
.
现在,创建一个新的framework
aka module
called MyAwesomeModule
。在该模块内创建一个名为的非公共类Person
.
如果您尝试使用该类Person
inside MyAwesomeProject
通过做import MyAwesomeModule
然后类似的东西let p = Person()
你会遇到一个错误。
但如果你这样做@testable import MyAwesomeModule
,奇迹发生了,您现在可以使用该类了。
基本上@testable
允许您测试未公开声明的内容。该注释仅适用于import
如你所见here https://github.com/apple/swift/blob/89c4ab0bb0de3d3aaf92f15c294c2db17a06040e/test/attr/testable.swift.
因此,为了工作,目标是用-enable-testing
这样您就可以访问非公开成员。至少基于什么here https://github.com/apple/swift/blob/aee81d272f3147c0a9b610956e72a7c0772b8bcb/include/swift/Basic/LangOptions.h#L132
因为,默认情况下,debug
构建配置是用-enable-testing
,我向您展示的示例将起作用。但是如果你将构建配置更改为release
,你会看到一条错误消息Module .. was not compiled for testing
自从release
配置不是用该标志构建的。
Swift 访问控制模型,如访问控制中所述
Swift 编程语言 (Swift 4) 的部分,防止
外部实体访问应用程序中声明为内部的任何内容
或框架。默认情况下,能够从您的
测试代码,您需要将他们的访问级别至少提升到
public,减少了 Swift 类型安全的好处。
Xcode 为这个问题提供了一个由两部分组成的解决方案:
当您将启用可测试性构建设置设置为是时,即
对于新项目中的测试构建,默认情况下为 true,Xcode 包括
- 编译期间启用测试标志。这使得编译模块中声明的 Swift 实体有资格获得更高级别的访问权限。
当您将 @testable 属性添加到导入语句时
模块在启用测试的情况下编译,您激活提升的访问权限
对于该范围内的该模块。类和类成员标记为
内部或公共的行为就好像它们被标记为打开一样。其他实体
标记为内部行为,就好像它们被宣布为公开一样。
More here https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/04-writing_tests.html
后期编辑:Swift 最酷的部分之一是它是开源的。因此,如果您想深入了解“魔法”,请查看:https://github.com/apple/swift https://github.com/apple/swift