可选绑定不能用于结构体:因为结构体是值类型,可选绑定用于类类型的
struct Person {
var name: String
var age: Int
}
var optionalLisa: Person? = Person(name: "Lisa Simpson", age: 8)
// 如果不是 nil,则增加
if optionalLisa != nil {
optionalLisa!.age += 1
}
这种写法非常繁琐,也很丑陋。特别注意,在这种情况下你不能使用可选绑定。因为 Person 是一个结构体,它是一个值类型,绑定后的值只是原来的值的局部作用域的复制,对这个复制进行变更,并不会影响原来的值:
if var lisa = optionalLisa {
// 对 lisa 的变更不会改变 optionalLisa 中的属性
lisa.age += 1
}
如果 Person 是类的话,这么做是可行的。我们会在结构体和类中进一步讨论值类型和引用类型的差异。就算能用可选绑定,这么写还是太过复杂了。其实,你可以使用可选值链来进行赋值,如果它不是 nil 的话,赋值操作将会成功:”
optionalLisa?.age += 1
一个有点古怪 (但是逻辑上是合理) 的边界情况是它也支持对可选值的直接赋值。下面的写法是合法的:
var a: Int? = 5
a? = 10
a // Optional(10)
var b: Int? = nil
b? = 10
b // nil
请注意 a = 10 和 a? = 10 的细微不同。前一种写法无条件地将一个新值赋给变量,而后一种写法只在 a 的值在赋值发生前不是 nil 的时候才生效。”
一个有点古怪 (但是逻辑上是合理) 的边界情况是它也支持对可选值的直接赋值。下面的写法是合法的:
var a: Int? = 5
a? = 10
a // Optional(10)
var b: Int? = nil
b? = 10
b // nil
请注意 a = 10 和 a? = 10 的细微不同。前一种写法无条件地将一个新值赋给变量,而后一种写法只在 a 的值在赋值发生前不是 nil 的时候才生效。”