我在Swift中遇到了一个语法,其中使用了双重问号(“??”)。
例如,let val = something["something"] as? String ?? nil
这究竟是什么意思?这种语法有哪些用例?
答案 0 :(得分:6)
Nil-Coalescing Operator
这是一种简短的形式。 (表示如果'aaa'
为nil
或可选),您可以指定默认值something["something"]
或任何其他值
nil
nil-coalescing运算符(a ?? b)如果包含值,则展开可选a;如果a为n,则返回默认值b。表达式a始终是可选类型。表达式b必须与存储在。
中的类型相匹配nil-coalescing运算符是下面代码的简写:
a!= nil?一个! :b 上面的代码使用三元条件运算符和强制解包(a!)来访问包含在a不是nil时的值,否则返回b。 nil-coalescing运算符提供了一种更简洁的方式来以简洁易读的形式封装这种条件检查和解包。
如果a的值为非零,则不评估b的值。这被称为短路评估。
下面的示例使用nil-coalescing运算符在默认颜色名称和可选的用户定义颜色名称之间进行选择:
let val = (something["something"] as? String) != nil ? (something["something"] as! String) : "default value"
部分
答案 1 :(得分:1)
这是Swift中的Nil-Coalescing Operator
。
nil-coalescing运算符(a ?? b)展开一个可选的a if 包含一个值,如果a为nil,则返回默认值b。该 表达式a始终是可选类型。表达式b必须 匹配存储在。
中的类型
但是在您的示例中,您已经使用了可选绑定,因此无需将??
与可选项一起使用,如果条件失败,则会自动分配nil
。
let val = something["something"] as? String ?? nil
如果something["something"] as? String
未能提供nil
,something["something"]
已经分配String
。所以这里不需要这个操作符。
答案 2 :(得分:1)
当赋值的表达式或变量产生可选结果时,此运算符通常用于提供默认值。例如:
let i: Int? = 5
let j: Int? = nil
let value1 = i ?? 9 //value1 will be 5 non-optional
let value2 = j ?? 9 //value2 will be 9 non-optional
您提供的示例尽管语法正确是多余的,因为省略?? nil
将不会对结果产生任何结果。