如何从子视图控制器重新定义协议扩展

How to re-define a protocol extension from a child view controller

我有一个带有定义功能的扩展的协议:

protocol DataFetch where Self: UIViewController {
    var data: [SomeData]! { get set }
    func fetchData()
    func didFetch()
}

extension DataFetch {
    func fetchData() {
        /// fetch data
    }
    func didFetch() {
        /// do something after fetching data
    }
}

然后,我有一个符合协议的视图控制器以及一个继承自父视图控制器的子视图控制器:

class ParentViewController: UIViewController, DataFetch {
    var data: [SomeData]! {
        didSet {
            didFetch()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        fetchData()
    }
}

class ChildViewController: ParentViewController {
    func didFetch() {
        /// do something else
    }
}

我想重写子视图控制器中的一个继承函数,但由于您不能使用协议扩展来做到这一点,我试图简单地重新定义函数定义。但是,我发现子视图控制器中重新定义的函数不会在 didSet.

中被调用

这更像是一种解决方法,但由于 didSet 似乎只处理当前范围 (ParentViewController) 而看不到 ChildViewController 中定义的内容,而且因为在实现时不能使用 override 关键字 didFetch 在 ChildViewController 中强制使用此解决方案引入了一个新功能,因此我们可以使 override 按预期工作

首先在父控制器中创建一个新函数,然后从 didSet 调用它,如下所示

class ParentViewController: UIViewController, DataFetch {
    var data: [String]! {
        didSet {
            workaround()
        }
    }

    func workaround() {
        didFetch()
    }
    //...
}

现在在子控制器中覆盖此函数,将调用正确的 didFetch

class ChildViewController: ParentViewController {
    override func workaround() {
        didFetch()
    }
    //...
}