Swift:基于另一个属性的设置,可以要求属性吗?

3

我希望能够重新利用一个单个viewcontroller,但需要进行一些重新定制,我想知道是否有一个结构化的方法可以要求根据另一个属性设置一些属性。

例如,假设viewcontroller具有以下属性 - var displayMode: DisplayMode //见下文 - var id: Int - var description: String - var name: String

如果我们处于quickView模式,则我期望设置ID和Description值。 否则,如果我们处于defaultView模式,则我期望设置Name属性。

enum DisplayMode {
    case quickView
    case defaultView
}

显然,我可以设置它们并期望它们被设置,但我想知道是否有一种类似于Swift的结构化方法来强制执行此操作,比如将这些属性嵌套在DisplayMode类型中?

你希望它有多严格?如果值未设置,您想在“viewDidLoad”上崩溃应用程序吗? - Tj3n
1
@michael-hudson:如果你使用响应式编程框架,如Reactive-Cocoa或RxSwift,这些东西就变得非常简单了。 - Sandeep Bhandari
@Tj3n NRitH的回答似乎满足了我的“需求”,本质上我希望它可以被嵌入,这样当我设置displayMode时,值也需要被设置。 - Michael Hudson
@SandeepBhandari 了解这个消息很不错,谢谢,我会看看那些框架的 :) - Michael Hudson
2个回答

2
考虑对您的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
}

通过使用关联值,您无需为iddescriptionname声明独立的属性(即对象变量)。

谢谢,我之前不知道有关联值,但这看起来正是我想要的!我也感谢你的附注;我的实际用例要复杂一些 - 我的示例只是一个人为的演示,但这是个很好的发现,我会更新以供未来的用户参考。 - Michael Hudson

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接