Возвращаемые данные не соответствуют типу возвращаемого метода, но все еще работают

Следующий фрагмент кода упрощен из главы " Необязательная цепочка" официального документа.

Короче говоря, класс Person имеет необязательное хранимое свойство address типа Адрес. К предложению некоторые / все имущество buildingName, buildingNumber а также street функция buildingNumber в типе Address может затем вызываться и возвращать вычисленный идентификатор здания типа необязательный String.

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:

Я использовал необязательное выражение для связывания (если разрешено), и бингинг кажется успешным, но почему тогда johnAddressID не распаковывается?

Спасибо, что зашли и помогли

0 ответов

Другие вопросы по тегам