下面的代码片段是从官方文档的Optional Chaining章节中简化而来的。
简而言之,Person类有一个可选的Addressaddress
类型的存储属性。通过提供部分/全部 property ,然后可以调用Address类型中的函数buildingNumber并返回一个可选 String 类型的计算建筑物标识符。buildingName
buildingNumber
street
class Person {
var address: Address?
}
class Address {
var buildingName: String?
var buildingNumber: String?
var street: String?
func buildingIdentifier() -> String? {
if buildingNumber != nil && street != nil {
return "\(buildingNumber) \(street)" //return type is String? String?
} else if buildingName != nil {
return buildingName
} else {
return nil
}
}
}
let john = Person()
john.address = Address()
let theAddress = Address()
theAddress.buildingNumber = "A12"
theAddress.street = "Sunset Street"
john.address = theAddress
if let johnAddressID = john.address?.buildingIdentifier() {
print("\(johnAddressID)") //##
}
让我们关注return "\(buildingNumber) \(street)"
函数buildingIdentifier()中的行。
问题1:
函数的返回类型是一个可选的字符串,但是函数体的返回是2个可选的字符串,为什么这是允许的?(请看下图是上面代码中##标记的行的打印结果)
问题 2:
我使用了可选的绑定表达式(if let),并且绑定似乎成功了,但是为什么 johnAddressID 没有解包呢?
感谢您的光临和帮助