oro*_*ome 1 syntax variable-assignment optional conditional-statements swift
在Swift,为什么呢
var x: Int? = nil
if let y: Int? = x { ... }
Run Code Online (Sandbox Code Playgroud)
表现不同于
if let y: Int? = nil { ... }
Run Code Online (Sandbox Code Playgroud)
我对第一个案例成功的原因的理解表明第二个案例也应该如此,所以我不能真正理解.
后者不会因为无效的分配而失败,也不会因为可选的链接而失败; 否则它看起来和前者一样.为什么后者失败了,它与前者有何不同.究竟是什么时候,以及出于什么原因,第二个可选绑定被放弃了?
if let y: Int? = nil { ... }
Run Code Online (Sandbox Code Playgroud)
相当于
if let y: Int? = nil as Int?? { ... }
Run Code Online (Sandbox Code Playgroud)
相当于
if let y: Optional<Int> = Optional<Optional<Int>>() { ... }
Run Code Online (Sandbox Code Playgroud)
这会尝试强制转换Optional<Optional<Int>>为Optional<Int>失败,因为Optional<Optional<Int>>()它不包含Optional<Int>值.
Oneliner相当于
var x: Int? = nil
if let y: Int? = x { ... }
Run Code Online (Sandbox Code Playgroud)
是
if let y: Int? = nil as Int? { ... }
Run Code Online (Sandbox Code Playgroud)
添加:
if let y: Int? = nil as Int? { ... }
Run Code Online (Sandbox Code Playgroud)
编译为:
if let y:Int? = nil as Int? as Int?? { ... }
Run Code Online (Sandbox Code Playgroud)
在这里,我们应该介意nil as Int? as Int??是不是等同于nil as Int??.前者是Optional(Optional<Int>()),但后者是Optional<Optional<Int>>().
考虑到这一点,我想,
所以我的第一个例子中的可选绑定(确实)"检查内部"并找到nil,这对于分配给Int是完全有效的吗?但我的第二次检查并找到Optional(nil),哪些不能分配给Int?
第一个例子是"检查内部",Int??只找到可以分配的类型的Optional<Int>()值; 但第二个发现没有任何东西可以分配并失败.Int?Int?