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

fen*_*e87 39 swift

所以我试图这样做

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

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

如果我将第一行更改为

let foo: String? = dict["key"] as? String ?? "empty"
Run Code Online (Sandbox Code Playgroud)

错误消失了.

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

Mar*_*n R 111

零合并运算符a ?? b是一个快捷方式

a != nil ? a! : b
Run Code Online (Sandbox Code Playgroud)

它返回左操作数解包或右操作数.所以foois 的类型String和第二行应该是

var bar = some_func(string: foo)
Run Code Online (Sandbox Code Playgroud)

没有感叹号因为foo不是可选的而且无法解开.

(如果您将第一行更改为

let foo: String? = dict["key"] as? String ?? "empty"
Run Code Online (Sandbox Code Playgroud)

然后右手边的结果再次被包裹成一个可选的字符串,需要在第二行中展开.它会让错误消失,但这可能不是你想要的.)