if project == nil {
project = Project()
}
project!.title = titleInput.text
project!.description = descInput.text
project!.field1 = field1.text
project!.field2 = field2.text
project!.field3 = field3.text
project!.field4 = field4.text
project!.field5 = field5.text
在上面的代码中,在为对象分配值之前,如果项目为nil,它将生成项目实例。因此,我们可以确定项目永远不会为零,但是在下面,它仍然使用!(项目!.xx),因此看起来很丑。
如何使其更清洁?
[编辑] 该项目是类变量,并且该项目可以为nil,也可以不是。 因此,我需要在创建实例之前进行检查。
答案 0 :(得分:4)
let project = project ?? Project()
project.title = titleInput.text
nil合并运算符??
的计算结果为表达式的非nil值或后面的非可选值。
更新以进行编辑:最干净的方法在一定程度上取决于此代码的上下文,但是我仍然可以使用类似的构造:
let project = self.project ?? Project()
project.title = titleInput.text
...
self.project = project
我开始怀疑,这个类属性真的应该是Optional
吗?为此,它真的应该是财产吗?
答案 1 :(得分:3)
如果实例为nil
,则该实例看起来像是惰性实例化属性。
if project == nil {
project = Project()
}
非常漂亮, objective-c-ish ,在Swift中有一种更复杂的方法,不需要lazy
关键字,因为默认情况下类属性是延迟实例化的。
static var project : Project = {
let proj = Project()
proj.title = titleInput.text
proj.description = descInput.text
proj.field1 = field1.text
proj.field2 = field2.text
proj.field3 = field3.text
proj.field4 = field4.text
proj.field5 = field5.text
return proj
}()
您也可以使用
static var project = Project()
或者Project
甚至具有引用语义
static let project = Project()
在类的顶层-属性也被延迟实例化-并在其他位置分配属性值。
在所有情况下,只有在首次访问实例并一次创建实例之后,才会创建实例。