简单的场景:我有一个基本的 ViewController,它有一个我想在子类中选择性地覆盖的方法。不同之处在于,我想在子类 ViewController 的扩展中进行覆盖。
这不起作用:
class BaseViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
overrideStyles()
}
func overrideStyles() {
// do nothing here. Optionally overridden as needed
}
}
class ViewController: BaseViewController {
}
// this is in another file that is to a specific target
extension ViewController {
override func overrideStyles() {
print("YAY!")
}
}
它也不适用于协议(protocol):
protocol OverridesStyles {
func overrideStyles()
}
extension OverridesStyles {
func overrideStyles() {
print("default method that does nothing")
// do nothing, this makes the method optional
}
}
class BaseViewController: UIViewController, OverridesStyles {
override func viewDidLoad() {
super.viewDidLoad()
overrideStyles()
}
}
// this is in another file that is to a specific target
extension ViewController {
func overrideStyles() {
print("YAY!")
}
}
我不能对整个 ViewController 类进行子类化,因为那是 Storyboard 中的类,我不能为每个目标创建不同的 Storyboard。
还有其他方法吗?我的想法是我可以有不同的目标和每个目标的不同扩展,因为 overrideStyles 方法可能会根据目标引用不同的 UI 元素。
谢谢。
最佳答案
文档给出了答案,这是一个规则:
Extensions can add new functionality to a type, but they cannot override existing functionality.
关于ios - 如何使用同一类为每个目标执行不同的功能?扩展和协议(protocol)让我失望,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36357770/