【问题标题】:How to re-define a protocol extension from a child view controller如何从子视图控制器重新定义协议扩展
【发布时间】:2021-06-27 18:08:46
【问题描述】:

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

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 中被调用。

【问题讨论】:

  • @JoakimDanielson 抱歉,这是一个错字。我已经从父视图控制器继承了,但是仍然没有调用该方法。

标签: ios swift swift-protocols


【解决方案1】:

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

首先在父控制器中新建一个函数,并从didSet调用如下

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-03-15
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多