我看了苹果所有的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"。我是不是错过了什么显而易见的痛苦?
如果您将代码更改为:
,那么您实际上永远不会创建有效的Residence
或Address
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()
问问自己:
-
什么是
paul
-
paul
的residence
属性设置为什么? -
paul
的residence
的address
是什么
提示:你不应该超过第2步
除了Person()
,你永远不会初始化任何东西,所以paul
上的residence
属性是nil
。
那么,在下面的可选链中:
addressNumber = paul.residence?.address?.buildingNumber?.toInt()
^ you get nil here and don't continue
表示addressNumber
是nil