为什么不调用子类中实现协议的方法?

时间:2016-10-11 22:25:29

标签: swift3

这是我在将项目更新为swift 3时遇到的新行为。在像这个示例的“子”类中实现UITableViewDelegate的方法

class A: NSObject, UITableViewDelegate {
    var tableView = UITableView()
    override init() {
        super.init()
        tableView.delegate = self
    }
}

class B: A {
    var count = 0
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        count += 1
    }
}

方法didSelectRowAt永远不会被调用:

let b = B()
b.tableView.delegate!.tableView?(b.tableView, didSelectRowAt: IndexPath())
b.count // => 0

但是,如果我在父项中实现该方法并在子项中覆盖它,那么它将开始工作:

class A: NSObject, UITableViewDelegate {
    var tableView = UITableView()
    override init() {
        super.init()
        tableView.delegate = self
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    }
}

class B: A {
    var count = 0
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        count += 1
    }
}

let b = B()
b.tableView.delegate!.tableView?(b.tableView, didSelectRowAt: IndexPath())
b.count // => 1

我尝试通过提供自己的协议和“表”类来更简化示例,但我无法让它再次以相同的方式运行。这使我相信在这个例子中观察到的行为不是预期的,实际上是一个错误。

是否还有其他人遇到相同(或类似)的问题?我认为值得问一下这可以帮助任何人。

1 个答案:

答案 0 :(得分:0)

对于任何登陆此处的人:看起来这是一个由快速团队修复过的真正的错误。有关详细信息,请参阅https://bugs.swift.org/browse/SR-2919