【问题标题】:Can I override a class method in a protocol the class will conform to?我可以在类将遵守的协议中覆盖类方法吗?
【发布时间】:2019-08-27 03:13:28
【问题描述】:

我的应用程序中的不同视图将需要从服务器获取一些数据,然后使用这些数据执行 segue:由于以下 VC 总是相同的,我认为定义一个将保存的协议可能是个好主意我自己每次都复制/粘贴代码。

但是,看起来 我不允许在我的视图将遵循的协议中覆盖“准备转场”方法。也许我还没有完全了解 Swift 中的协议是如何工作的?

添加 override 关键字将导致编译器出现“方法不会覆盖其超类中的任何方法”错误,但无论如何该函数都不会被调用。

protocol StoreGetter : UIViewController {
    func showStore(_ storeId: String)
    /*override*/ func prepare(for segue: UIStoryboardSegue, sender: Any?) //gives compiler error with override keyword
}

extension StoreGetter {
    func showStore(_ storeId : String) {
        //... fetches data from server and eventually:
        self.performSegue(withIdentifier: "toStoreProfile", sender: store)
        //...
    }

    /*override*/ func prepare(for segue: UIStoryboardSegue, sender: Any?) { //never gets called anyways
        if let storeProfileTVC = segue.destination as? StoreProfileTVC {
            if let store = sender as? Store {
                storeProfileTVC.store = store
            }
        }
    }
}

这样做的目的是不必在每个符合此协议的类中复制/粘贴“prepare for segue”方法,从而继承 showStore 方法(我目前正在这样做)

我能想到的另一个选择是:

  1. 定义另一个继承自 UIViewController 的类
  2. 使其符合 StoreGetter,覆盖那里的“准备转场”
  3. 并将其用作我的其他视图的超类

...不确定这是否也是一种干净的方法。

解决这个问题的最佳方法是什么?

【问题讨论】:

  • 您的用例更符合让一个类继承自 UIViewController 并让其他类从这个自定义类子类化(如您的帖子中所述)而不是使用 protocol

标签: ios swift swift-protocols


【解决方案1】:

正如@Malik 所说,协议似乎不是正确的方法。

您应该创建一个BaseViewController,在那里定义您的prepareForSegue 方法,并且您的所有UIViewController 类都应该从它继承。

现在您可以在需要自定义逻辑的地方为 ViewControllers 覆盖 prepareForSegue

【讨论】:

    猜你喜欢
    • 2017-05-11
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 2010-11-10
    • 2010-11-25
    • 1970-01-01
    • 2018-03-04
    相关资源
    最近更新 更多