这是一个新手问题,但是为什么当我赋值'john.residence?.numberOfRooms = 5‘,然后尝试用optional-chaining解包值时,它会输出"no room“??
我认为通过赋值(numberOfRooms = 5),它将包含该值?
class Residence {
var numberOfRooms = 1
}
class Person {
var residence: Residence?
}
let john = Person()
john.residence?.numberOfRooms = 5 // I try to assign the value 5
if let roomCount = john.residence?.numberOfRooms {
print("\(roomCount)") // why is roomCount not 5???
} else {
print("no rooms")
}
// -> no rooms发布于 2021-02-05 02:06:42
仅当numberOfRooms为非nil时,语句john.residence?.numberOfRooms = 5才会赋值给john.residence。如果它是nil,它不会做任何事情。
它只是可选绑定的语法糖,它允许你深入可选变量的长键路径,比如a?.b?.c?.d,而不需要在每一步手动解开每个对象。如果路径中的任何内容为nil,则整个表达式只会生成nil。如果这是一个任务,什么都不会发生。
发布于 2021-02-05 02:39:26
正如@Alexander和@Joakim Danielson所说的那样,可选链是原因所在。我想对此补充一点信息。
你需要在每一步实例化,也就是把每个变量当作它们自己的变量。
更合理的方法应该是……
let john = Person()
let johnsResidence = Residence()
john.residence = johnsResidence
john.residence?.numberOfRooms = 5 // I try to assign the value 5
if let roomCount = john.residence?.numberOfRooms {
print("\(roomCount)")
} else {
print("no rooms")
}我们将约翰的住所指定为新的住所,将约翰的住所指定为新的住所`
John numberOfRooms to 5.如果我们没有分配住所,则无法分配numberOfRooms。
如果我们没有分配人员,则无法分配住所。
注意:尝试运行此示例,如下所示:
class Person {
var residence: Residence
}您将看到,当您尝试执行john.residence.numberOfRooms = 5时,将得到一个nil错误
发布于 2021-02-05 02:49:32
让我们一块一块地看你的代码!
class Residence {
var numberOfRooms = 1
}它描述了Residence类。它有一个numberOfRooms属性,该属性被初始化为1,但可以在以后更改(var)。
class Person {
var residence: Residence?
}这描述了Person类。它有一个被初始化为nil的residence属性(请仔细阅读)。可选参数,默认值为nil,且初始未分配实际的Residence实例。但它可以在以后更改(var)。
let john = Person()现在john是Person的一个实际实例。正如我刚才所说的,默认情况下,该Person的residence属性是nil。
john.residence?.numberOfRooms = 5也就是说:“如果john的residence不是nil,则将5赋给它的numberOfRooms;如果它是nil,则什么也不做。”而它是nil,因此什么都不会发生。
你会对这一切做些什么呢?好吧,在故事的某个阶段,你可能会给可怜的john一个residence
john.residence = Residence()这种情况从来没有发生过,所以john的residence仍然是nil。
我认为你最终的困惑是这一行的含义:
var residence: Residence?这给了residence一个类型(即一个可选的Residence),但不是一个Residence值;它最初是一个nil可选值,并且将一直保持下去,直到有人给这个变量分配了一个实际的Residence。
https://stackoverflow.com/questions/66050982
复制相似问题