首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为可选实例属性赋值?

如何为可选实例属性赋值?
EN

Stack Overflow用户
提问于 2021-02-05 01:41:53
回答 3查看 53关注 0票数 0

这是一个新手问题,但是为什么当我赋值'john.residence?.numberOfRooms = 5‘,然后尝试用optional-chaining解包值时,它会输出"no room“??

我认为通过赋值(numberOfRooms = 5),它将包含该值?

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2021-02-05 02:06:42

仅当numberOfRooms为非nil时,语句john.residence?.numberOfRooms = 5才会赋值给john.residence。如果它是nil,它不会做任何事情。

它只是可选绑定的语法糖,它允许你深入可选变量的长键路径,比如a?.b?.c?.d,而不需要在每一步手动解开每个对象。如果路径中的任何内容为nil,则整个表达式只会生成nil。如果这是一个任务,什么都不会发生。

票数 0
EN

Stack Overflow用户

发布于 2021-02-05 02:39:26

正如@Alexander和@Joakim Danielson所说的那样,可选链是原因所在。我想对此补充一点信息。

你需要在每一步实例化,也就是把每个变量当作它们自己的变量。

更合理的方法应该是……

代码语言:javascript
复制
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")
}

我们将约翰的住所指定为新的住所,将约翰的住所指定为新的住所`

  • We Assign John's John numberOfRooms to 5.

如果我们没有分配住所,则无法分配numberOfRooms。

如果我们没有分配人员,则无法分配住所。

注意:尝试运行此示例,如下所示:

代码语言:javascript
复制
class Person {
    var residence: Residence
}

您将看到,当您尝试执行john.residence.numberOfRooms = 5时,将得到一个nil错误

票数 0
EN

Stack Overflow用户

发布于 2021-02-05 02:49:32

让我们一块一块地看你的代码!

代码语言:javascript
复制
class Residence {
    var numberOfRooms = 1
}

它描述了Residence类。它有一个numberOfRooms属性,该属性被初始化为1,但可以在以后更改(var)。

代码语言:javascript
复制
class Person {
    var residence: Residence?
}

这描述了Person类。它有一个被初始化为nilresidence属性(请仔细阅读)。可选参数,默认值为nil,且初始未分配实际的Residence实例。但它可以在以后更改(var)。

代码语言:javascript
复制
let john = Person()

现在john是Person的一个实际实例。正如我刚才所说的,默认情况下,该Person的residence属性是nil

代码语言:javascript
复制
john.residence?.numberOfRooms = 5

也就是说:“如果johnresidence不是nil,则将5赋给它的numberOfRooms;如果它是nil,则什么也不做。”而它是nil,因此什么都不会发生。

你会对这一切做些什么呢?好吧,在故事的某个阶段,你可能会给可怜的john一个residence

代码语言:javascript
复制
john.residence = Residence()

这种情况从来没有发生过,所以johnresidence仍然是nil

我认为你最终的困惑是这一行的含义:

代码语言:javascript
复制
var residence: Residence?

这给了residence一个类型(即一个可选的Residence),但不是一个Residence值;它最初是一个nil可选值,并且将一直保持下去,直到有人给这个变量分配了一个实际的Residence。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66050982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档