überschreiben Methode Signaturen in Erweiterungen scheint in bestimmten Fällen unvorhersehbare Ergebnisse zu erzeugen. Das folgende Beispiel zeigt zwei verschiedene Ergebnisse mit einem ähnlichen Muster.Swift-Dispatch zu überschreiben Methoden in Unterklassenerweiterungen
class A: UIViewController {
func doThing() {
print("dothing super class")
}
override func viewDidLoad() {
print("viewdidload superclass")
super.viewDidLoad()
}
}
class B: A { }
extension B {
override func doThing() {
print("dothing sub class")
super.doThing()
}
override func viewDidLoad() {
print("viewdidload subclass")
super.viewDidLoad()
}
}
let a: A = B()
a.doThing()
let vc: UIViewController = B()
vc.viewDidLoad()
Diese Drucke:
dothing super class
viewdidload subclass
viewdidload superclass
Sie können sehen, das die B
‚s Implementierung von doThing
überspringt, wenn er als A
gegossen wird, jedoch beide Implementierungen von viewDidLoad
enthält, wenn sie als UIViewController
gegossen. Ist das das erwartete Verhalten? Wenn ja, was ist der Grund dafür?
ENV: Xcode 7.3, Spielplatz
Versuchen Sie 'dynamic func doThing()' in der Oberklasse. – jtbandes
@jtbandes Das erzeugt das erwartete Ergebnis (dh die Aufrufe sowohl der Unterklassenimplementierung als auch der Superklassenimplementierung). Aber ich bin nicht klar, warum das erforderlich wäre und anders als das Verhalten bei der Umwandlung in 'UIViewController'. Unterscheiden sich die Verhaltensweisen auf Basis des Modulumfangs? – ahtierney