Swift 对none可选变量应用Nil合并运算符时,不会触发任何错误

Swift 对none可选变量应用Nil合并运算符时,不会触发任何错误,swift,operators,optional,Swift,Operators,Optional,nil合并运算符(a??b)如果包含值,则展开optianl a;如果a为nil,则返回默认值b。表达式a始终是可选类型 Nil凝聚运算符是下面代码的简写 a!=无a!:b 然后我尝试了以下测试代码片段 //First let a: Int = 3, b: Int = 4 a ?? b // No error & 问题: 为什么编译器对第一个代码段不给出错误,而对第二个代码段大喊错误?他们不一样吗 非常感谢 零凝聚算子 public func ??<T>(optional: T?

nil合并运算符(a??b)如果包含值,则展开optianl a;如果a为nil,则返回默认值b。表达式a始终是可选类型

Nil凝聚运算符是下面代码的简写

a!=无a!:b

然后我尝试了以下测试代码片段

//First
let a: Int = 3, b: Int = 4
a ?? b // No error
&

问题:

为什么编译器对第一个代码段不给出错误,而对第二个代码段大喊错误?他们不一样吗

非常感谢


零凝聚算子

public func ??<T>(optional: T?, @autoclosure defaultValue: () throws -> T)  rethrows -> T
第一个操作数
a
不是可选的。但是,编译器可以 将非可选值
T
按顺序“包装”到可选值
T?
匹配函数或运算符。例如,在

func foo(x: Int?) { }
foo(3)
参数
3
被包装成
Int?

在您的例子中,表达式相当于

Optional<Int>.Some(a) ?? b
Optional<Int>.Some(a) != nil ? Optional<Int>.Some(a)! : b
可选。一些(a)??B
这相当于

Optional<Int>.Some(a) ?? b
Optional<Int>.Some(a) != nil ? Optional<Int>.Some(a)! : b
可选。一些(a)!=无可选。部分(a)!:B
然而,编译器并没有那么聪明地认识到这一点
可选。某些(a)
不能为
nil