此代码来自Apple的新书。我的问题是:为什么“让roomCount = john.residence?.numberOfRooms”为零,我认为.numberOfRooms应为1但在xcode中它表示为零我只是不知道为什么是零。如果有人能澄清我这将是非常棒的。先感谢您。
class Person {
var residence: Residence?
}
class Residence {
var numberOfRooms = 1
}
let john = Person()
let roomCount = john.residence?.numberOfRooms
john.residence = Residence()
john.residence?.numberOfRooms
if let roomCount = john.residence?.numberOfRooms {
print("John's residence has \(roomCount) room(s).")
} else {
print("Unable to retrieve the number of rooms.")
}
答案 0 :(得分:3)
let roomCount = john.residence?.numberOfRooms
在此行中,roomCount必须为nil,因为您没有设置住宅实例变量。 在john.residence = Residance()之后,roomCount不是零。
好吧
let roomCount = john.residence?.numberOfRooms
就像这样
let roomCount: Int! = nil
if let unwrappedResidence = john.residence
{
roomCount = unwrappedResidence.numberOfRooms
}
因此,如果居住地为零,则roomCount为零。
答案 1 :(得分:2)
residence
尚未初始化
let roomCount = john.residence?.numberOfRooms
因此,这将始终打印nil
,因为residence
无法返回。
如果您想使用.numberOfRooms
首先初始化您的residence
实例并以这种方式使用它:
let john = Person()
john.residence = Residence()
let roomCount = john.residence?.numberOfRooms // 1
另一种方法是将其初始化为Person
类:
class Person {
var residence = Residence()
}
现在您可以这样使用.numberOfRooms
:
let john = Person()
let roomCount = john.residence.numberOfRooms // 1
答案 2 :(得分:2)
在示例中,行let john = Person()
创建了一个 Person 类型的对象 john 。
人类型包含可选属性住所,即var residence: Residence?
此处住所 nil ,因为住宿尚未初始化。但是可以访问其属性 numberOfRooms 甚至住所是nil(因为这里使用可选链接)并且访问它的结果是nil
let roomCount = john.residence?.numberOfRooms
之后居住初始化并分配时,
john.residence = Residence()
现在, john.residence 对象已初始化,当访问其 numberOfRooms 属性时,它返回默认的指定值1。
在swift中,可选属性可以访问属性,无论它们是否为零(初始化或未初始化)。
可选链接
可选链接是在当前可能为nil 的可选项上查询和调用属性,方法和下标的过程。如果optional包含值,则属性,方法或下标调用成功; 如果optional是nil,则属性,方法或下标调用返回nil 。多个查询可以链接在一起,如果链中的任何链接为零,整个链都会正常失败。