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 个访问级别(open
和 fileprivate
)并更改了 private
的含义:
private
:符号仅在当前声明中可见。
fileprivate
:符号在当前文件中可见。
internal
:符号在当前模块中可见。
public
:符号在当前模块外可见。
open
:用于在当前模块之外对类或函数进行子类化或覆盖。
【讨论】:
嗨 Yann,选择哪个访问级别也取决于测试要求。当您在单元测试中使用“@testable import”时,它不允许访问私有或文件私有符号。它确实开放了对内部符号的访问以上是关于Xcode 8:不能从非开放类继承[重复]的主要内容,如果未能解决你的问题,请参考以下文章