如何在多个视图控制器的过程中初始化 class
How do I initialize a class over the course of several view controllers
我有一个 Event
class,其中包含 Date
、Time
、Activity
等变量。用户可以创建一个 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.
我有一个 Event
class,其中包含 Date
、Time
、Activity
等变量。用户可以创建一个 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.