小编aht*_*ney的帖子

Swift调度到子类扩展中的重写方法

在某些情况下,扩展中的重写方法签名似乎会产生不可预测的结果.以下示例演示了具有类似模式的两种不同结果.

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,游乐场

ios swift

14
推荐指数
1
解决办法
908
查看次数

标签 统计

ios ×1

swift ×1