gpt4 book ai didi

xcode - 不使用强制展开属性进行打印不会触发 Swift 中的运行时错误

转载 作者:行者123 更新时间:2023-11-30 10:03:04 25 4
gpt4 key购买 nike

我有下面的代码,它工作正常,但我期望 print(john.residence!.numberOfRooms) 行崩溃,因为我的 numberOfRooms 变量有nil 值,并且在将其值作为参数传递给 print() 时,我没有使用强制换行。谁能解释一下为什么这不会触发运行时错误并安全地打印 nil

class Person {
var residence: Residence?
}

class Residence {
var numberOfRooms: Int?
}

let john = Person()

john.residence = Residence()

print(john.residence!.numberOfRooms)

最佳答案

您正在做的事情称为可选链。可选链接和强制展开都做同样的事情,但是:

The main difference is that optional chaining fails gracefully when the optional is nil, whereas forced unwrapping triggers a runtime error when the optional is nil.

“The Swift Programming Language (Swift 2.2).” iBooks. https://itun.es/br/jEUH0.l

您强制解开 .residence 属性,该属性不是 nil:它包含一个 Residence 实例,该实例具有其 >.numberOfRooms 属性设置为 nil,因为它尚未初始化。由于您没有强制解开它,因此由于可选链接,不会给出任何错误。尝试强制展开 .numberOfRooms 属性,而不是收到错误:

print(john.residence!.numberOfRooms!)

或者,您可以删除以下行以将 .residence 设置为 nil:

john.residence = Residence()

这样 john 就没有 .residence,因此尝试强制解开它将使 Swift 编译器抛出运行时错误。

关于xcode - 不使用强制展开属性进行打印不会触发 Swift 中的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37406452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com