如何在多个视图控制器的过程中初始化 class

How do I initialize a class over the course of several view controllers

我有一个 Event class,其中包含 DateTimeActivity 等变量。用户可以创建一个 Event 带有一系列视图控制器,让用户一次构造一个变量,有点像演练。我的问题是为了在第一个屏幕上初始化 Event 我使用了一个空的初始化程序,默认情况下所有实例变量都是可选的。当用户浏览屏幕时,它们会被相应地设置。随着时间的推移,我将如何正确初始化这个 class ?对所有变量使用可选值似乎不合适。

我想在第一个屏幕上像这样初始化 Event

var event = Event()

并一一设置它的实例变量,而不是它们都是可选的。

您无法随时间初始化 class。您可以随时间设置实例的属性。既然如此,你所做的似乎很好。 但是,您也可以继续调用一个构建器,该构建器仅在提供了所有需要的信息后才创建完全形成的事件。想象这样的架构(在您的操场上尝试一下):

class Event : CustomStringConvertible {
    let fee : String
    let fi : String
    let fo : String
    let fum : String
    init(fee:String, fi:String, fo:String, fum:String) {
        self.fee = fee; self.fi = fi; self.fo = fo; self.fum = fum
    }
    var description : String {
        "Event: \(fee) \(fi) \(fo) \(fum)"
    }
}

class EventBuilder {
    private var fee : String?
    private var fi : String?
    private var fo : String?
    private var fum : String?
    private var event : Event?
    private func makeEventIfPossible() {
        guard event == nil else {return}
        if let fee = fee,
           let fi = fi,
           let fo = fo,
           let fum = fum {
            print("making event")
            self.event = Event(fee: fee, fi: fi, fo: fo, fum: fum)
        }
    }
    func takeFee(_ fee:String) {
        self.fee = fee
        makeEventIfPossible()
    }
    func takeFi(_ fi:String) {
        self.fi = fi
        makeEventIfPossible()
    }
    func takeFo(_ fo:String) {
        self.fo = fo
        makeEventIfPossible()
    }
    func takeFum(_ fum:String) {
        self.fum = fum
        makeEventIfPossible()
    }
    func giveEvent() -> Event? {
        self.event
    }
}

let b = EventBuilder()
b.takeFee("Fee")
b.takeFi("Fi")
b.takeFo("Fo")
b.takeFum("Fum")
if let event = b.giveEvent() {
    print(event) // and away we go
}

您可以传递 EventBuilder,不同的对象可以调用不同的 take 方法,在提供所有信息并创建事件之前,没有人可以使用 giveEvent 获取事件.如您所见,事件仅创建一次,其 none 属性是可选的。构建器将整个创建过程隐藏在功能表示之后(因此得名)。

我可以想象进一步的改进,比如您可以使 take 方法 throws 方法在该值已经设置的情况下拒绝接受该值,等等。此外,我认为您可能会以某种方式使用键路径来制作代码 neater/smaller.