0

下面的代码片段是从官方文档的Optional Chaining章节中简化而来的。

简而言之,Person类有一个可选的Addressaddress类型的存储属性。通过提供部分/全部 property ,然后可以调用Address类型中的函数buildingNumber并返回一个可选 String 类型的计算建筑物标识符。buildingNamebuildingNumberstreet

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 没有解包呢?

感谢您的光临和帮助

4

0 回答 0