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
。