在某些情况下,扩展中的重写方法签名似乎会产生不可预测的结果.以下示例演示了具有类似模式的两种不同结果.
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()
Run Code Online (Sandbox Code Playgroud)
这打印:
dothing super class
viewdidload subclass
viewdidload superclass
Run Code Online (Sandbox Code Playgroud)
你可以看到这个跳过B的的实现doThing时,它铸造成A,但包括两个实现viewDidLoad时铸成UIViewController.这是预期的行为吗?如果是这样,原因是什么?
ENV:Xcode 7.3,游乐场