swift中的可选项



我看了苹果所有的swift教程,但我有一个例子有问题:

class Person {
    var residence: Residence?
}
class Residence {
    var address: Address?
}
class Address {
    var buildingNumber: String? = "234"
    var streetName: String? = "Main St."
    var appartmentNumber: String?
}
let paul = Person()
var addressNumber: Int?
addressNumber = paul.residence?.address?.buildingNumber?.toInt()
if let number = addressNumber {
    "correct"
} else {
    "fault"
}

总是打印"fault"。我是不是错过了什么显而易见的痛苦?

如果您将代码更改为:

,那么您实际上永远不会创建有效的ResidenceAddress
class Person {
    // actually create a residence object
    var residence: Residence? = Residence()
}
class Residence {
    // actually create a address object
    var address: Address? = Address()
}
class Address {
    // ...
}
let paul = Person()
var addressNumber: Int?
// Before Paul was never assigned a valid residence, now one will be created
addressNumber = paul.residence?.address?.buildingNumber?.toInt()
if let number = addressNumber {
    "correct"
} else {
    "fault"
}
// gives you `correct`

那么它应该工作得很好!

let paul = Person()

您没有对paul做任何其他操作,包括设置他的可选驻留变量。因此,在下一行代码中,您将访问paul的住所,即nil

addressNumber = paul.residence?.address?.buildingNumber?.toInt()
                      ^ failing right here, residence? returns nil

因此,使用可选链接,整个表达式返回nil,因此当与下一个if let语句进行比较时,它是假的。这就是执行else子句的原因。

仔细想想,一步一步来。特别是,你的可选链接:

addressNumber = paul.residence?.address?.buildingNumber?.toInt()

问问自己:

  1. 什么是paul

  2. paulresidence属性设置为什么?

  3. paulresidenceaddress是什么

提示:你不应该超过第2步

除了Person(),你永远不会初始化任何东西,所以paul上的residence属性是nil

那么,在下面的可选链中:

addressNumber = paul.residence?.address?.buildingNumber?.toInt()
                              ^ you get nil here and don't continue

表示addressNumbernil

最新更新