我可以找到几篇解释可选变量的文章。
但我仍然不清楚这种例子。
var metadata: AnyObject?
metadata = .......
metadata?.getValue
metadata!.getValue
元数据?和元数据!,两者都没有任何运行时错误。 有人可以解释一下差异吗?
答案 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)
}
如果y
为nil
,则总和为x + 0
,否则会添加两个整数。
有更好/更有效的方法来完成这个功能的功能,这只是一个例子。您可以在此处阅读有关Nil Coalescing Operator