Возвращаемые данные не соответствуют типу возвращаемого метода, но все еще работают
Следующий фрагмент кода упрощен из главы " Необязательная цепочка" официального документа.
Короче говоря, класс 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 не распаковывается?
Спасибо, что зашли и помогли