发布于 2015-06-14 01:58:28 | 157 次阅读 | 评论: 0 | 来源: 网络整理
你可以将多层可选链连接在一起,可以掘取模型内更下层的属性方法和子脚本。然而多层可选链不能再添加比已经返回的可选值更多的层。 也就是说:
如果你试图获得的类型不是可选类型,由于使用了可选链它将变成可选类型。 如果你试图获得的类型已经是可选类型,由于可选链它也不会提高可选性。
因此:
如果你试图通过可选链获得Int
值,不论使用了多少层链接返回的总是Int?
。 相似的,如果你试图通过可选链获得Int?
值,不论使用了多少层链接返回的总是Int?
。
下面的例子试图获取john
的residence
属性里的address
的street
属性。这里使用了两层可选链来联系residence
和address
属性,它们两者都是可选类型:
if let johnsStreet = john.residence?.address?.street {
println("John's street name is (johnsStreet).")
} else {
println("Unable to retrieve the address.")
}
// 打印 "Unable to retrieve the address.”。
john.residence
的值现在包含一个Residence
实例,然而john.residence.address
现在是nil
,因此john.residence?.address?.street
调用失败。
从上面的例子发现,你试图获得street
属性值。这个属性的类型是String?
。因此尽管在可选类型属性前使用了两层可选链,john.residence?.address?.street
的返回值类型也是String?
。
如果你为Address
设定一个实例来作为john.residence.address
的值,并为address
的street
属性设定一个实际值,你可以通过多层可选链来得到这个属性值。
let johnsAddress = Address()
johnsAddress.buildingName = "The Larches"
johnsAddress.street = "Laurel Street"
john.residence!.address = johnsAddress
if let johnsStreet = john.residence?.address?.street {
println("John's street name is (johnsStreet).")
} else {
println("Unable to retrieve the address.")
}
// 打印 "John's street name is Laurel Street."。
值得注意的是,“!
”符号在给john.residence.address
分配address
实例时的使用。john.residence
属性是一个可选类型,因此你需要在它获取address
属性之前使用!
解析以获得它的实际值。