Swift可选链接

时间:2015-09-25 06:04:58

标签: ios swift

此代码来自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.")
}

3 个答案:

答案 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 。多个查询可以链接在一起,如果链中的任何链接为零,整个链都会正常失败。

Find reference here