如何覆盖继承 类 扩展中的函数?

How to override function in extensions for inherited classes?

我有一个 scrollToBottom 函数用于 UIScrollViewUITableView。问题是它们相互冲突并出现错误:Declarations in extensions cannot override yet

这是我的:

extension UIScrollView {

    func scrollToBottom(animated: Bool = true) {
        ...
    }
}

extension UITableView {

    func scrollToBottom(animated: Bool = true) {
        ...
    }
}

由于 UITableView 继承自 UIScrollView,因此不允许我这样做。我怎样才能做到这一点?

创建协议 ScrollableToBottom 并在其中定义您的方法:

protocol ScrollableToBottom {
    func scrollToBottom(animated: Bool)
}

使 UIScrollViewUITableView 从它继承:

extension UIScrollView: ScrollableToBottom  { }
extension UITableView: ScrollableToBottom  { }

然后你只需要扩展你的协议约束 Self 到特定的 class:

extension ScrollableToBottom where Self: UIScrollView {
    func scrollToBottom(animated: Bool = true) {

    }
}
extension ScrollableToBottom where Self: UITableView {
    func scrollToBottom(animated: Bool = true) {

    }
}

您可以使用默认实现的协议扩展

protocol CanScrollBottom {
    func scrollToBottom()
}

extension CanScrollBottom where Self: UIScrollView {
    func scrollToBottom() {
        //default implementation
    }
}

extension UIScrollView: CanScrollBottom { }

extension UITableView {
    func scrollToBottom() {
        //override default implementation
    }
}