swift - 如何在多个视图控制器的过程中初始化一个类
问题描述
我有一个Event
类,其中包含 、 、 等变量Date
。Time
用户Activity
可以Event
使用一系列视图控制器创建一个,让用户一次构造一个变量,有点像演练。我的问题是为了Event
在第一个屏幕上初始化,我使用了一个空的初始化程序,并且所有实例变量默认情况下都是可选的。当用户浏览屏幕时,它们会被相应地设置。随着时间的推移,我将如何正确初始化这个类?对所有变量使用选项似乎不合适。
我想像这样Event
在第一个屏幕上初始化:
var event = Event()
并一一设置它的实例变量,而不是它们都是可选的。
解决方案
你不能随着时间的推移初始化一个类。您可以随着时间的推移设置实例的属性。既然如此,你正在做的似乎很好。但是,或者您可以继续调用构建器,该构建器仅在提供了所有需要的信息时才创建完全形成的事件。想象一下这样的架构(在您的操场上尝试一下):
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
方法,如果该值已经设置,它们将拒绝接受一个值,等等。另外我认为您可能会以某种方式使用键路径来使代码更整洁/更小。
推荐阅读
- php - 参数 1 传递给 Symfony\Component\VarDumper\Server\Connection::__construct() ... 在第 49 行的 DumpServerServiceProvider.php 中调用
- c# - 在 .NET 中,什么时候调用 getter 和 setter?
- python - 重组 pandas 数据框,将 Column 变成新的 Header,原始 Header 成为具有预先存在的 Column 的多索引的一部分
- angular - 如何与重定向共享令牌验证功能?
- django - 没有将其注册为应用程序的 Django 文件夹
- kubernetes - Cassandra Kubernetes Statefulset NoHostAvailableException
- android - 如何从pdf阅读器的文件中获取pdf
- reactjs - 如何在 Azure 中安装 Semantic-UI
- reactjs - FontAwesome 微调器不会在 React 中旋转
- java - 模拟服务层中的字段注入依赖项,包括推土机映射器