我在Swift中遇到了一个语法,其中使用了双重问号("??").
例如, let val = something["something"] as? String ?? nil
这到底是什么意思?这种语法有哪些用例?
Nil-Coalescing运算符
这是一种简短的形式.(表示您可以指定默认值nil或任何其他值,如果something["something"]是nil或可选)
let val = (something["something"] as? String) != nil ? (something["something"] as! String) : "default value"
Run Code Online (Sandbox Code Playgroud)
如果a包含值,则nil-coalescing运算符(a ?? b)展开可选a;如果a为n,则返回默认值b.表达式a始终是可选类型.表达式b必须与存储在a中的类型匹配.
nil-coalescing运算符是下面代码的简写:
a!=零?一个!:b上面的代码使用三元条件运算符和强制解包(a!)来访问包含在a不是nil时的值,否则返回b.nil-coalescing运算符提供了一种更简洁的方式来以简洁易读的形式封装此条件检查和展开.
如果a的值不为nil,则不评估b的值.这被称为短路评估.
下面的示例使用nil-coalescing运算符在默认颜色名称和可选的用户定义颜色名称之间进行选择:
let defaultColorName = "red"
var userDefinedColorName: String? // defaults to nil
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName is nil, so colorNameToUse is set to the default of "red"
Run Code Online (Sandbox Code Playgroud)
请参阅此处的Nil-Coalescing Operator部分
此运算符通常用于在表达式或变量产生可选结果时提供默认值。例如:
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
Run Code Online (Sandbox Code Playgroud)
您可以像这样链接多个这些运算符:
let value3 = j ?? i ?? 9 //value3 will be 5 non-optional
Run Code Online (Sandbox Code Playgroud)
每当发现非 nil 值时,链就会终止。表达式的结果将是可选/非可选的,具体取决于链中最后一个表达式的类型。
您提供的示例虽然在语法上是正确的,但却是多余的,因为省略 将?? nil不会对结果产生任何影响。