gpt4 book ai didi

swift - swift 中奇怪的可选值用法

转载 作者:搜寻专家 更新时间:2023-10-31 22:17:17 25 4
gpt4 key购买 nike

    var z1 = false
var z2 = false
var z3 = false


if let y1: Int = nil {
z1 = true
}

if let y2: Int? = nil {
z2 = true
}

var x: Int? = nil
if let y3: Int? = x {
z3 = true
}

println(z1) // false
println(z2) // ture
println(z3) // false

我尝试像这样使用可选值(我知道这很奇怪,我只是对深度的可选值感到好奇)。

结果并不如我所料。 z1 是假的,这是我所期望的,但为什么 z2 是真的?赋值后y2为nil,但是if语句认为这个表达式(let y2: Int? = nil)为真,执行下一条语句(z2=true ),为什么会这样?

为什么 z2 不是假的?

如果 y2 只是声明为一个可选值,它可以包含另一个可选值,可选值可能为 nil,if let 语句只是检测解包成功,那么,为什么 z3 不正确?

最佳答案

这是因为您可以将可选变量声明为递归可选的,如下所示:

var x: Int?? = 5
// LLDB: p x.dynamicType returns (Int??)

你可以走得更远:

var y: Int????????? = 6
// LLDB: p x.dynamicType returns (Int?????????)

if let 构造的作用是检查您是否可以解包一个可选值,即使它的最终值为 nil,您也可以解包 optional 可选值.把它想象成可选值不是 nil 本身,它是一些包装 nil 的对象。

要在代码中检查它,您可以执行以下操作:

var a: Int? = nil;
// LLDB: p a! returns fatal error: Can't unwrap Optional.None

var b: Int?? = nil;
// LLDB: p b! returns (Int?) $R2 = nil

所以这就是您的 z2 条件发生的情况:if let 构造正在检查它是否可以打开 y2 并且它是,所以执行了 if block 。

关于swift - swift 中奇怪的可选值用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24053246/

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