带有默认值的Swift可选变量赋值(双问号)

时间:2014-12-12 08:39:59

标签: swift

所以我试图做

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"

错误消失了。

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

2 个答案:

答案 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