ios - 我可以重写类将遵循的协议(protocol)中的类方法吗?

标签 ios swift swift-protocols

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

但是,看起来我不允许覆盖我的 View 将遵循的协议(protocol)中的“prepare for segue”方法。也许我还不太清楚协议(protocol)在 Swift 中是如何工作的?

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

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
            }
        }
    }
}

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

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

  1. 定义另一个继承自 UIViewController 的类
  2. 使其符合 StoreGetter 并覆盖那里的“准备转场”
  3. 并将其用作我其他 View 的父类(super class)

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

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

最佳答案

正如 @Malik 所说,协议(protocol)在这里似乎不是正确的方法。

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

现在,您可以为需要自定义逻辑的 ViewController 重写 prepareForSegue

关于ios - 我可以重写类将遵循的协议(protocol)中的类方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57667256/

相关文章:

ios - 如何像 whats app 那样创建联系人列表

ios - 拖放防止多个项目同时移动

swift - 数字运算和返回类型

swift - Swift 中作为类型的泛型协议(protocol)

ios - 自定义协议(protocol)委托(delegate)方法不调用

ios - AVAudioPlayer 得到错误的文件持续时间 iOS 10

ios - iOS 4 的 UIPageViewController 模板回退

json - 类型仅在运行时已知时的 Swift 4 JSON 解码

ios - ALEXA 语音服务响应 : "sorry I am not sure" or "hmmm i dont know that"

ios - Swift Alamofire - 使用 NULL 值参数的 POST 请求