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

时间:2018-02-28 23:52:09

标签: swift extension-methods

scrollToBottomUIScrollView有一个UITableView函数。问题是它们之间存在冲突,并出现错误:Declarations in extensions cannot override yet

这就是我所拥有的:

extension UIScrollView {

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

extension UITableView {

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

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

2 个答案:

答案 0 :(得分:1)

创建协议ScrollableToBottom并在那里定义您的方法:

protocol ScrollableToBottom {
    func scrollToBottom(animated: Bool)
}

UIScrollViewUITableView从中继承:

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

然后,您只需要将协议约束Self扩展到特定类:

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

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

    }
}

答案 1 :(得分:1)

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

protocol CanScrollBottom {
    func scrollToBottom()
}

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

extension UIScrollView: CanScrollBottom { }

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