【发布时间】: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