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 。