【问题标题】:Declarations in extensions cannot override yet error in Swift 4扩展中的声明不能覆盖 Swift 4 中的错误
【发布时间】:2017-11-20 20:01:34
【问题描述】:

我有一个扩展:

public extension UIWindow {
    override public func topMostController()->UIViewController? { ... }
}

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

Declarations in extensions cannot override yet error

它适用于 Swift 3.1,但对于 Swift 4,我收到此错误。如何修复?它们在 Swift 4 中发生了什么变化?

【问题讨论】:

标签: ios swift swift-playground swift4


【解决方案1】:

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

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

Swift 中的扩展可以:

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

Apple Developer Guide

您尝试做的与此代码所做的类似:

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

extension MyClass {
    override func myFunc() {}
}

注意:如果你想override topMostController() 则创建UIWindow 的子类

【讨论】:

    【解决方案2】:

    如果您将基本实现设为@objc,它将起作用。有关内部结构的详细说明,请参阅Hamish's answer

    要正确执行在扩展中声明的覆盖方法有点棘手。 Objective-C 支持它,但它不是绝对安全的。 Swift 的目标是做得更好。提案尚未完成。

    提案的当前版本可用here

    【讨论】:

    • 我刚刚在 Swift 4 项目上对其进行了测试!
    • 我猜如果它在 objc 中可见,它可以在运行时处理。这种东西在某种程度上可能是正确的,但见鬼:Swift 变得和 objc 一样丑……
    • 你的意思是添加@objc 之前 override public func topMostController()->UIViewController?
    【解决方案3】:

    斯威夫特 5

    其实OP代码有几个问题:

    1. UIViewUIWindow 的超类)没有方法topMostController(),所以你不能覆盖它。

    2. Apple 不鼓励 override funcextension:

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

    3. 如果您仍想在扩展中覆盖函数,有两种方法:

    [A] 在父类中用@objc dynamic func 标记您的函数:

    class Vehicle {
        @objc dynamic func run() { /* do something */ }
    }
    
    class Car: Vehicle { }
    
    extension Car {
        override func run() { /* do another thing */ }
    }
    

    [B] 覆盖内置类的函数,它是NSObject 的后代。

     extension UIWindow {
        // UIWindow is a descendant of NSObject, and its superclass UIView has this function then you can override
        override open func becomeFirstResponder() -> Bool {
            ...
            return super.becomeFirstResponder()
        }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 2016-11-07
      相关资源
      最近更新 更多