ios - 如何使用同一类为每个目标执行不同的功能?扩展和协议(protocol)让我失望

标签 ios swift

简单的场景:我有一个基本的 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/

相关文章:

ios - 如何将自定义 map 图钉添加到 Apple Watch 上的 map View ?

ios - Swift - 播放声音时出现错误 "fatal error: unexpectedly found nil while unwrapping an Optional value"

ios - 自定义 UITableView 单元格 Nib 文件仅在选择单元格后显示?

ios - Swift 字典,读取键值 - 推送通知

ios - 在 iOS 上使用 TwitterKit 上传视频

swift - 如何向 CloudKit 中的现有记录添加字段

ios - 如何将 NSInputStream 转换为 UIImage

ios - UIView 中的 Swift UILabel

arrays - 最常见的数组元素

ios - 此类与键的键值编码不兼容...为什么?