澄清Swift可选值的用法

时间:2016-08-10 23:06:23

标签: swift

我可以找到几篇解释可选变量的文章。

但我仍然不清楚这种例子。

var metadata: AnyObject?
metadata = .......
metadata?.getValue
metadata!.getValue

元数据?和元数据!,两者都没有任何运行时错误。 有人可以解释一下差异吗?

1 个答案:

答案 0 :(得分:1)

在您的示例中,元数据实际为零时,它们之间的差异会变得更加清晰。

var metadata: AnyObject?
metadata = nil
metadata?.getValue
metadata!.getValue

该代码会使第4行崩溃,但不会使第3行崩溃。这是因为!运算符会解包变量,而?运算符允许您进行可选链接,如果您想了解更多关于它的信息,可以执行此操作here

另一个有用的运算符是??,在您的示例中,您可以编写:

metadata ?? "Another description"

如果表达式的左侧部分为nil,则返回正确的部分。它在某些情况下很有用。

2016-08-10评论后编辑: ??被称为 nil coalescing operator ,它是一个二元运算符。第一个参数必须是可选类型。它检查是否可以安全地解包第一个参数,如果成功则返回该未包装的值。如果第一个值为nil,则返回第二个参数。

表达式

return x ?? y

相当于

if x != nil {
    return x!
} else {
    return y
}

return x != nil ? x! : y

假设我们想要创建一个添加两个整数的函数,但有时第二个可以是nil,我们可以写

func add(x: Int, y: Int?) -> Int{
    return x + (y ?? 0)
}

如果ynil,则总和为x + 0,否则会添加两个整数。 有更好/更有效的方法来完成这个功能的功能,这只是一个例子。您可以在此处阅读有关Nil Coalescing Operator

的更多信息