Переопределение метода в расширении, Swift - PullRequest
0 голосов
/ 23 января 2020

С какой версии 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 больше не строит.

Ответы [ 2 ]

0 голосов
/ 23 января 2020

как вы можете видеть здесь -> Документация по расширениям вы можете добавлять новые функции, но вы не можете переопределить методы в расширениях.

ПРИМЕЧАНИЕ

Расширения может добавлять новые функциональные возможности к типу, но они не могут переопределять существующие функциональные возможности.

Таким образом, вы не можете сделать это в Swift 5.1

0 голосов
/ 23 января 2020

Dynami c модификатор

Вы можете сделать это, используя 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

Протестировано с Swift 5.1.3

...