覆盖扩展中的方法,Swift

Overriding a method in an extension, Swift

从哪个版本的 Swift 开始,以下代码不再构建?

import Foundation

@objc class Class: NSObject {
  @objc func str() -> String {
    return "Hello, playground"
  }
}

class Subclass: Class {

}

extension Subclass {
  override func str() -> String {
    return "Hi"
  }
}

据我了解,Swift 的早期版本编译此代码时产生了意外结果。在 Swift 5.1 上,它不再构建。

动态修饰符

您可以使用 dynamic 修饰符

@objc class Animal: NSObject {

    @objc dynamic func saySomething() {
        print("I am an Animal")
    }

}

@objc class Dog: Animal { }

extension Dog {

    override func saySomething() {
        print("I am a Dog")
    }

}

Dog().saySomething() // I am a Dog

Tested with Swift 5.1.3

如您在此处所见 -> Extensions documentation 您可以添加新功能,但不能覆盖扩展中的方法。

NOTE

Extensions can add new functionality to a type, but they cannot override existing functionality.

所以你不能在 Swift 5.1