扩展中的声明无法覆盖Swift 4中的错误

J. *_*Doe 62 ios swift swift-playground swift4

我有一个扩展名:

public extension UIWindow {
    override public func topMostController()->UIViewController? { ... }
}
Run Code Online (Sandbox Code Playgroud)

但是对于我,topMostController我得到了下一个错误:

Declarations in extensions cannot override yet error
Run Code Online (Sandbox Code Playgroud)

它适用于Swift 3.1,但对于Swift 4,我得到了这个错误.怎么修好?他们在Swift 4中有什么变化?

Sul*_*han 66

如果您进行基本实现,它将起作用@objc.有关内部结构的详细解释,请参阅Hamish的答案.

在扩展中声明的重写方法有点难以正确执行.Objective-C支持它,但它不是绝对安全的.斯威夫特的目标是做得更好.该提案尚未完成.

此处提供的当前版本的提案.

  • 有用!你能解释一下原因吗?:) (2认同)

Nik*_*iya 12

扩展可以为类型添加新功能,但它们不能覆盖现有功能.

扩展为现有的类,结构,枚举或协议类型添加新功能.这包括扩展您无法访问原始源代码的类型的能力(称为追溯建模).

Swift中的扩展可以:

  • 添加计算实例属性和计算类型属性
  • 定义实例方法和类型方法
  • 提供新的初始化程序
  • 定义下标
  • 定义并使用新的嵌套类型
  • 使现有类型符合协议

Apple开发人员指南

您尝试执行的操作类似于此代码所执行的操作:

class MyClass: UIWindow {
    func myFunc() {}
}

extension MyClass {
    override func myFunc() {}
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您想再override topMostController()创建子类UIWindow