作为Xcode 8 beta 6,我现在得到编译错误"不能从非开放类(类)继承"在其定义模块之外"
我继承的类是一个独立的Swift框架的一部分,但我的项目是为Xcode 8 beta 5编译的。我需要改变什么才能让我的项目再次编译?
我自己找到了答案。
在Swift 3中,你现在可以将一个类标记为open
而不是public
,这允许模块外的文件继承该类。
只需将模块类中的public
替换为open
。
参考。
您继承的类需要定义为open
而不是public
。
关于Swift 3中访问控制变化的更多背景信息:
Swift 2只有3个访问级别:
-
private
:实体只能在定义它们的源文件中使用。 -
internal
:实体可用于包含定义的整个模块。 -
public
:实体被用作API,可以被任何导入该模块的文件访问。
Swift 3增加了2个访问级别(open
和fileprivate
),并改变了private
的含义:
-
private
:符号只在当前声明中可见。 -
fileprivate
:符号在当前文件中可见 -
internal
:当前模块或默认访问修饰符中可见的符号。 -
public
:符号在当前模块外部可见。 -
open
:用于在当前模块之外子类化或重写的类或函数。
即使将类标记为open
(在Xcode 14.1上),我也会出现此错误。修复是清理(Cmd + Shift + K)并重建。