Xcode 8:不能从非开放类继承[重复]

Posted

技术标签:

【中文标题】Xcode 8:不能从非开放类继承[重复]【英文标题】:Xcode 8: Cannot inherit from non-open class [duplicate] 【发布时间】:2016-08-22 06:05:14 【问题描述】:

更新到最新的 Xcode 8 后,我收到此错误:

不能从其定义模块之外的非开放类“WDBaseViewController”继承

我的班级是这样声明的

public class ProfileViewController: WDBaseViewController 

但我没有改变框架。

【问题讨论】:

基类WDBaseViewController需要在你使用的框架中定义为open而不是public 另请参阅 What is the 'open' keyword in Swift? 和 Xcode 8 beta 6 发行说明。 是的,我找到了。谢谢。 【参考方案1】:

简答:

为了能够对其进行子类化,基类WDBaseViewController 需要在您使用的框架中定义为open 而不是public

open class WDBaseViewController 
    ...

如果是内部框架可以自己做,否则就得等作者支持Swift 3了。

长答案:

Swift 3 为访问控制带来了重大变化。

Swift 2 只有 3 个访问级别:

private:实体仅在定义它们的源文件中可用。 internal:实体可用于包含定义的整个模块。 public:实体旨在用作 API,并且可以被任何导入模块的文件访问。

Swift 3 增加了 2 个访问级别(openfileprivate)并更改了 private 的含义:

private:符号仅在当前声明中可见。 fileprivate:符号在当前文件中可见。 internal:符号在当前模块中可见。 public:符号在当前模块外可见。 open:用于在当前模块之外对类或函数进行子类化或覆盖。

【讨论】:

嗨 Yann,选择哪个访问级别也取决于测试要求。当您在单元测试中使用“@testable import”时,它不允许访问私有或文件私有符号。它确实开放了对内部符号的访问

以上是关于Xcode 8:不能从非开放类继承[重复]的主要内容,如果未能解决你的问题,请参考以下文章

类的继承8.2

为啥派生类不能继承operator =()函数[重复]

java容器类的继承结构

1-8继承extends

为啥我的 UIDynamicAnimator 类继承不能使用 addChildBehavior

Unity脚本类为啥要尽量避免继承MonoBehaviour类