【发布时间】: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 方法(我目前正在这样做)
我能想到的另一个选择是:
- 定义另一个继承自 UIViewController 的类
- 使其符合 StoreGetter,覆盖那里的“准备转场”
- 并将其用作我的其他视图的超类
...不确定这是否也是一种干净的方法。
解决这个问题的最佳方法是什么?
【问题讨论】:
-
您的用例更符合让一个类继承自
UIViewController并让其他类从这个自定义类子类化(如您的帖子中所述)而不是使用protocol
标签: ios swift swift-protocols