If statement 为什么Swift&x27;s可选绑定成功与';无';在某些情况下?

If statement 为什么Swift&x27;s可选绑定成功与';无';在某些情况下?,if-statement,swift,optional,If Statement,Swift,Optional,苹果公司表示,可选绑定(又称为“代码”)将“检查可选绑定中的值”,并“将该值提取到”变量或常量中)。但这和我看到的不符。比如说 var x: Int? = nil if let y1: Int? = x { println("y1 = \(y1)") // This is printed, suggesting that x is not checked "inside", but left as Optional(nil) (!= nil) } if let y2: Int? =

苹果公司表示,可选绑定(又称为“代码”)将“检查可选绑定中的值”,并“将该值提取到”变量或常量中)。但这和我看到的不符。比如说

var x: Int? = nil

if let y1: Int? = x {
    println("y1 = \(y1)") // This is printed, suggesting that x is not checked "inside", but left as Optional(nil) (!= nil)
}

if let y2: Int? = x? {
    println("y2 = \(y2)")
}

if let y3: Int = x? {
    println("y3 = \(y3)")
}

if let y4: Int = x {
    println("y4 = \(y4)")
}

if let y5 = x? {
    println("y5 = \(y5)")
}

if let y6 = x {
    println("y6 = \(y6)")
}
结果(仅限)

表明在
y1
案例中未进行
x
的“内部”检查(并且
x
被保留为已包装的
nil
,这不等于未包装的
nil
)。
y2
案例似乎通过强制“内部检查”(或者这只是可选的链接“接管”)来证实这一点;但肯定还有更多的故事,因为
y4
y6
案例也没有打印出来,因此表现为“内部检查”正在发生

我怀疑从尝试中可以获得一些洞察力

"x = 42"
导致

"y1 = Optional(42)"
"y2 = Optional(42)"
"y3 = 42"
"y4 = 42"
"y5 = 42"
"y6 = 42"
但如果有三个,我就不知道了

似乎(1)如果要求显式检查(使用
),表达式右侧的“可选”确实会得到“内部检查”;但除此之外(2)表达式的左侧会影响执行检查的“内部”距离(刚好足以进行有效赋值)


在这些情况下,可选绑定是如何工作的?特别是,当
x==nil
为什么
y1
打印,既然打印了,为什么不
y4
y6
(或生成赋值错误)?

我对此有不同的解释:

var x: Int? = 1

if let y1: Int = x {
    println("y1 = \(y1)") 
}

//prints y = 1, the optional was checked, contains a value and passes it

var x: Int? = nil

if let y1: Int = x {
    println("y1 = \(y1)") 
}

//does not execute because x does not contain value that can be passed to a non optional y

var x: Int? = nil

if let y1: Int? = x {
    println("y1 = \(y1)")
}
// y = nil, since y is optional and can hold a value of x which is nil, then it passes nil

可选绑定用于检查可选参数是否包含要传递给非可选参数的值。

您已将可选Int分配给可选Int。分配成功。无论可选的Int是否包含Int,它都将始终成功

所以是这样的:首先检查右侧的“可选链接”(即第一个
y2
y3
y5
案例结束的位置)。然后,如果这不是
nil
,那么如果可以进行有效的分配,事情就会继续进行。就这么简单吗?是的,如果链上的任何地方都是零,绑定就会失败。如果您需要知道绑定失败的地方,这里有一个很好的讨论:因此:在
y2
y3
y5
情况下,可选链接命中
nil
,事情就结束了。在
y4
y6
的情况下,检查
x
的内部,并找到
nil
(且无法分配给非可选项),因此事情结束。但我仍然对y1到底发生了什么感到困惑:这里似乎没有发生“检查内部”的事情。如果有,事情就会失败(例如,如果让y1:Int?=nil{…}失败)。似乎“检查内部”是为了让作业正常工作而必须进行的。我认为语法x有点混乱?当x最初是可选的时。我从来没有想过尝试这种语法。我把它解释为{nil}或一些nil。在赋值声明中,它显然与nil本身不一样,即使它在操场上打印为nil。不管怎样,你提出了一个聪明的问题。我认为你很慷慨:我不确定“有”混乱;可能只是我感到困惑。这当然是一个人为的例子,但我假设它与任何其他可选的链接表达式一样,
x?.something
,除了“something”是身份-即,它什么也不做,所以如果“inside”
x
不是
nil
表达式将像往常一样重新包装(因为表达式可以是
nil
,这必须是可选的)。所以在这种情况下(
y1
)不会发生“内部检查”。这样的检查似乎只在需要使赋值工作时才会发生(cases
y4
y6
,当
x
为非
nil
)对吗?这里的关键(对我来说)这就是为什么
let y1:Int?=nil{…}
的行为与
let y1:Int?=x{…}
的行为不同,其中
x
nil
(请参阅讨论)。
var x: Int? = 1

if let y1: Int = x {
    println("y1 = \(y1)") 
}

//prints y = 1, the optional was checked, contains a value and passes it

var x: Int? = nil

if let y1: Int = x {
    println("y1 = \(y1)") 
}

//does not execute because x does not contain value that can be passed to a non optional y

var x: Int? = nil

if let y1: Int? = x {
    println("y1 = \(y1)")
}
// y = nil, since y is optional and can hold a value of x which is nil, then it passes nil