Swift可选variables赋值与默认值(双重问号)

所以我试着去做

let foo = dict["key"] as? String ?? "empty" var bar = some_func(string: foo!) 

和XCode 6抱怨说
Operand of postfix '!' should have optional type; type is 'String'
在第二行。

如果我改变第一行

 let foo: String? = dict["key"] as? String ?? "empty" 

错误消失。

这是一种缺陷还是我做错了什么?

nil-coalescing运算符a ?? b a ?? b是一个捷径

 a != nil ? a! : b 

它将返回未解包的左操作数或右操作数。 所以foo的types是String ,第二行应该是

 var bar = some_func(string: foo) 

没有感叹号,因为foo不是可选的,不能被解开。

(如果您将第一行更改为

 let foo: String? = dict["key"] as? String ?? "empty" 

那么右边的结果再次被包装成一个可选的string,并且需要在第二行中解包。 它使错误消失,但这可能不是你想要的。)

你的foo将是一个String不是String? 因为零合并操作符?? 如果它是.some (导致一个String )或者将使用"empty" ,这也是一个String ,将打开你的条件.some