frozen - ShenYj/ShenYj.github.io GitHub Wiki
针对枚举或者结构体的声明使用该特性,可以限制你对该类型的修改。它只有在编译迭代库时被允许使用。未来版本的库不能通过添加、删除或重新排序枚举的 case 或结构的存储实例属性来更改声明。在未冻结的类型上,这些操作都是允许的,但是他们破坏了冻结类型的 ABI 兼容性。
当编译器不处于迭代库的模式,所有的结构体和枚举都是隐性冻结,并且该特性会被忽视。
在迭代库的模式中,与未冻结结构体和枚举的成员进行交互的代码在被编译时,允许它在不重新编译的情况下继续工作,即使在新版本的库中添加、删除或重新排序该类型的成员。
编译器用类似运行时查找信息和添加间接层的技术使之可能。将一个枚举或者结构体标记为冻结将以放弃这种灵活性为代价来获取性能上的提升:未来版本的库只能对类型进行有限的更改,但编译器可以对与类型成员交互的代码进行额外的优化。
使用冻结类型,结构体存储属性的类型以及枚举 case 的关联值必须是 public 或使用 usablefrominline
特性标记。冻结结构体的属性不能有属性观察器,为存储实例属性提供初始值的表达式必须遵循与 inlinable
函数相同的限制,如 inlinable 中所述。
要在命令行上启用迭代库模式,需要将 -enable-library-evolution
选项传递给 Swift 编译器。
要在 Xcode 中支持它,则将生成设置 “Build Libraries for Distribution”(BUILD_LIBRARY_FOR_DISTRIBUTION)
设置为 Yes
。
针对冻结枚举的 switch 语法,不需要
default case
,就像 对未来枚举的 case 进行 switch。
在针对冻结枚举使用 switch 语法时包含default
或@unknown default case
将生成警告,因为该代码永远不会执行。
摘自于 SwiftGG