首页 > 解决方案 > 如何在多个视图控制器的过程中初始化一个类

问题描述

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

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

var event = Event()

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

标签: swiftxcodeclassoptional

解决方案


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

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提供所有信息并创建 Event 之前,没有人可以获取 Event。如您所见,Event 只创建一次,它的所有属性都不是可选的。构建器将整个创建过程隐藏在功能表示之后(因此得名)。

我可以想象进一步的改进,比如你可以让take方法成为throws方法,如果该值已经设置,它们将拒绝接受一个值,等等。另外我认为您可能会以某种方式使用键路径来使代码更整洁/更小。


推荐阅读