【问题标题】:A class inherits another class and conforms to a protocol - trying to reconcile two interfaces一个类继承另一个类并符合一个协议——试图协调两个接口
【发布时间】:2016-03-30 12:00:53
【问题描述】:

大家好。 我发现自己正在与类型系统作斗争,这可能意味着我正在做(或思考)一些完全错误的事情,我需要你的编程鹰眼来发现它。

在我的应用程序中,我有一个设置视图(控制器),它显示不同设置窗格(它们是 ViewController)的视图 - 一次一个,将它们的视图添加为其子视图。

现在,这是我的问题。每个设置窗格都是一个类,定义如下:

protocol SettingsPane {
    var componentTitle: String { get }
    func saveState()
}

class SettingsPaneVC: UIViewController, SettingsPane {
...
}

有时我需要它的UIViewController 和其他时候SettingsComponent 界面的一部分,所以我发现自己处于需要满足其中之一的情况,然后在需要时强制向下转换另一个。例如:

var components: [SettingsPane] = [
    SomeSettingsPane(),
    AnotherSettingsPane(), 
    etc...
]

for component in components {

    (component as! UIViewController).view.frame = ....
}

// but...
...text = self.components.first!.componentTitle

我正在寻找的是一种可以让我摆脱沮丧的解决方案。我一直试图利用这样一个事实,即任何符合SettingsComponent 的东西都应该始终是UIViewController 的子类,但我还没有想出任何可以接受的东西。到目前为止,我的尝试产生了这样的代码:

protocol SettingsPane {

    var componentTitle: String { get }
    var view: UIView! { get set } //what I need from UIViewController
    func saveState()
}

有没有办法通过SettingsPane 使整个UIViewController 的界面可用?还是我注定要在SettingsPane 中列出我需要的具体内容?

【问题讨论】:

  • 不能在实现两个接口的SettingsPaneVC上操作吗?
  • 与SettingsPaneVC类似的类有很多(不只是一个类),即使它们有相同的接口,它们也不是严格相同的类型。不优雅。

标签: ios swift class inheritance types


【解决方案1】:

如果每个SettingsPane 都将成为UIViewController 的子类,您可以创建一个SettingsViewController 子类。

class SettingsViewController : UIViewController {
    var componentTitle: String {
        fatalError()
    }

    func saveState() {
        fatalError()
    }
}

我意识到这有一些问题:

  1. 您不能子类化任何其他内容,例如 UITableViewControllerUICollectionViewContorller
    • 这可能会破坏交易,也可能不会。
  2. 未实现所需方法时不会出现编译错误,如果方法未被覆盖,则会出现运行时错误。
  3. 您可以做的大部分事情都可以通过协议扩展来完成
    • extension SettingsPane where Self : UIViewController {}

有没有办法制作整个UIViewController的界面 可通过 SettingsPane 获得?

这是一个子类。

或者我注定要在 SettingsPane 中具体列出我需要什么?

是的,这实际上可能是件好事。如果您只需要UIView,您可能想隐藏所有UIViewController 的东西。你没有具体说明你还需要什么,所以这可能是个糟糕的主意。

【讨论】:

  • 到目前为止,我似乎只需要 view 属性,但谁知道未来会带来什么。我喜欢有一个接口,它只为我实际需要的东西提供一个 API,但我希望有一种自动化机制的方法(所以我不必在 SettingsPane 中手动列出东西)。
  • 我希望协议可以从类继承。事情会更容易;)
猜你喜欢
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多