我可以覆盖 class 将遵守的协议中的 class 方法吗?
Can I override a class method in a protocol the class will conform to?
我的应用程序中的不同视图需要从服务器获取一些数据,然后使用这些数据执行 segue:因为以下 VC 始终相同,我认为这可能是个好主意定义一个协议,让我每次都免于 copy/pasting 代码。
但是,看起来 我不允许覆盖协议中的 "prepare for segue" 方法,我的观点将遵守 。也许我还不太了解协议在 Swift 中的工作原理?
添加 override 关键字将导致编译器出现 "Method does not override any method from its superclass" 错误,但无论如何都不会调用该函数。
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
}
}
}
}
这样做的目的是 不必 copy/paste 每个 class 中的 "prepare for segue" 方法将符合此协议 ,因此继承 showStore 方法(我目前正在这样做)
我能想到的另一个选择是:
- 正在定义另一个 class 继承自 UIViewController
- 符合 StoreGetter 覆盖 "prepare for segue" 那里
- 并将其用作我的其他观点的超级class
...不确定这是否是一种干净的方法。
解决此问题的最佳方法是什么?
正如@Malik 所说,协议 似乎不是正确的方法。
您应该创建一个 BaseViewController
,在那里定义您的 prepareForSegue
方法,并且您的所有 UIViewController
类 都应该继承它。
现在您可以在需要自定义逻辑的 ViewController
处覆盖 prepareForSegue
。
我的应用程序中的不同视图需要从服务器获取一些数据,然后使用这些数据执行 segue:因为以下 VC 始终相同,我认为这可能是个好主意定义一个协议,让我每次都免于 copy/pasting 代码。
但是,看起来 我不允许覆盖协议中的 "prepare for segue" 方法,我的观点将遵守 。也许我还不太了解协议在 Swift 中的工作原理?
添加 override 关键字将导致编译器出现 "Method does not override any method from its superclass" 错误,但无论如何都不会调用该函数。
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
}
}
}
}
这样做的目的是 不必 copy/paste 每个 class 中的 "prepare for segue" 方法将符合此协议 ,因此继承 showStore 方法(我目前正在这样做)
我能想到的另一个选择是:
- 正在定义另一个 class 继承自 UIViewController
- 符合 StoreGetter 覆盖 "prepare for segue" 那里
- 并将其用作我的其他观点的超级class
...不确定这是否是一种干净的方法。
解决此问题的最佳方法是什么?
正如@Malik 所说,协议 似乎不是正确的方法。
您应该创建一个 BaseViewController
,在那里定义您的 prepareForSegue
方法,并且您的所有 UIViewController
类 都应该继承它。
现在您可以在需要自定义逻辑的 ViewController
处覆盖 prepareForSegue
。