Swift3将值分配给可为空的对象

时间:2018-10-22 14:17:21

标签: swift

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,也可以不是。 因此,我需要在创建实例之前进行检查。

2 个答案:

答案 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()

在类的顶层-属性也被延迟实例化-并在其他位置分配属性值。

在所有情况下,只有在首次访问实例并一次创建实例之后,才会创建实例。