所以我试图做
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"
错误消失了。
这是某种缺陷还是我做错了什么?
答案 0 :(得分:111)
nil-coalescing operator a ?? b
是
a != nil ? a! : b
它返回左操作数 unwrapped 或右操作数。因此foo
的类型为String
,第二行应为
var bar = some_func(string: foo)
没有感叹号,因为foo
不是可选的,无法解开。
(如果您将第一行更改为
let foo: String? = dict["key"] as? String ?? "empty"
然后右侧的结果再次被包装成一个可选的字符串,并且需要 在第二行打开。它会使错误消失,但这可能不是你想要的。)
答案 1 :(得分:4)
您的foo
将是String
而不是String?
,因为零合并运算符??
将解包您的条件转换,如果它是.some
(结果在String
)或它将使用"empty"
,这也是String
。