我想重新使用一个viewcontroller但稍微重新定位,我想知道是否有一种结构化方法需要根据另一个属性设置一些属性。
For example assume that the viewcontroller has the following properties
- var displayMode: DisplayMode // see below
- var id: Int
- var description: String
- var name: String
如果我们处于quickView模式,那么我希望设置ID和Description值。 否则,如果我们处于defaultView模式,我希望设置Name属性。
enum DisplayMode {
case quickView
case defaultView
}
显然我可以设置它们并期望它们被设置但是我想知道是否存在一种类似Swift的强制方式,比如将属性嵌套在DisplayMode类型中?
答案 0 :(得分:2)
考虑将associated values用于enum
个案例,例如:
enum DisplayMode {
case quickview(id: Int, description: String)
case defaultview(name: String)
}
这会强制用户在声明DisplayMode
变量时提供有效的关联值:
var mode = DisplayMode.quickView(id: 11, description: "Prosecco")
要恢复关联的值,请将它们绑定到switch
:
switch mode {
case let .quickView(id, description):
// do something with id and description
case let .defaultview(name):
// do something with name
}
通过使用关联值,您不必为id
,description
或name
声明独立属性(即对象变量)。
答案 1 :(得分:1)
我觉得这样的事情就是你想要的:
var displayMode: DisplayMode {
didSet {
if displayMode == quickview {
// self.id = whatever
// do whatever else you want
}
else if displayMode == default {
// self.id = whatever
// do whatever else you want
}
}
}
var id: Int
var description: String
var name: String
(编辑:当然,它会有点不同,因为你正在使用枚举,但你得到了它的要点。)
另一种选择可能是使用KVO。 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html