Xcode8: 不能从非开放继承class
Xcode 8: Cannot inherit from non-open class
我更新到最新的 Xcode 8 后,我得到这个错误:
Cannot inherit from non-open class ‘WDBaseViewController’ outside of its defining module
我的class是这样声明的
public class ProfileViewController: WDBaseViewController {
}
但是我没有改框架
简答:
为了能够子class它,基础class WDBaseViewController
需要在框架中定义为open
而不是public
正在使用。
open class WDBaseViewController {
...
}
如果是内部框架可以自己做,否则就得等作者支持了Swift 3.
长答案:
Swift 3 正在为访问控制带来重大变化。
Swift 2 只有 3 个访问级别:
private
:实体只能在定义它们的源文件中使用。
internal
: 实体对包含该定义的整个模块可用。
public
:实体旨在用作 API,并且可以被导入该模块的任何文件访问。
Swift 3 正在添加 2 个访问级别(open
和 fileprivate
)并更改 private
:
的含义
private
: 符号仅在当前声明中可见。
fileprivate
: 符号在当前文件中可见。
internal
: 符号在当前模块中可见。
public
: 符号在当前模块外可见。
open
: 对于 class 或要在当前模块外被子class 或覆盖的函数。
我更新到最新的 Xcode 8 后,我得到这个错误:
Cannot inherit from non-open class ‘WDBaseViewController’ outside of its defining module
我的class是这样声明的
public class ProfileViewController: WDBaseViewController {
}
但是我没有改框架
简答:
为了能够子class它,基础class WDBaseViewController
需要在框架中定义为open
而不是public
正在使用。
open class WDBaseViewController {
...
}
如果是内部框架可以自己做,否则就得等作者支持了Swift 3.
长答案:
Swift 3 正在为访问控制带来重大变化。
Swift 2 只有 3 个访问级别:
private
:实体只能在定义它们的源文件中使用。internal
: 实体对包含该定义的整个模块可用。public
:实体旨在用作 API,并且可以被导入该模块的任何文件访问。
Swift 3 正在添加 2 个访问级别(open
和 fileprivate
)并更改 private
:
private
: 符号仅在当前声明中可见。fileprivate
: 符号在当前文件中可见。internal
: 符号在当前模块中可见。public
: 符号在当前模块外可见。open
: 对于 class 或要在当前模块外被子class 或覆盖的函数。