Swift “是什么意思?”&引用;斯威夫特?

Swift “是什么意思?”&引用;斯威夫特?,swift,syntax,Swift,Syntax,我在Swift中遇到了一种使用双问号(“??”)的语法 例如,将val=something[“something”]设为?一串无 这到底意味着什么?此语法有哪些用例?Nil合并运算符 这是一种简短的形式。(意味着您可以指定默认值nil或任何其他值,如果something[“something”]为nil或可选) 如果可选a包含值,则nil合并运算符(a??b)将其展开;如果a为nil,则返回默认值b。表达式a始终是可选类型。表达式b必须与存储在a中的类型匹配 nil凝聚运算符是以下代码的简写:

我在Swift中遇到了一种使用双问号(“??”)的语法

例如,
将val=something[“something”]设为?一串无


这到底意味着什么?此语法有哪些用例?

Nil合并运算符

这是一种简短的形式。(意味着您可以指定默认值
nil
或任何其他值,如果
something[“something”]
nil
或可选)

如果可选a包含值,则nil合并运算符(a??b)将其展开;如果a为nil,则返回默认值b。表达式a始终是可选类型。表达式b必须与存储在a中的类型匹配

nil凝聚运算符是以下代码的简写:

a!=无a!:B 上面的代码使用三元条件运算符和强制展开(a!)在a不是nil时访问a中包装的值,否则返回b。nil合并操作符提供了一种更优雅的方式,以简洁易读的形式封装此条件检查和展开

如果a的值为非零,则不计算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"

请参见第

节,这是Swift中的
Nil凝聚运算符

零合并运算符(a??b)将打开一个可选的a,如果它 包含一个值,如果a为nil,则返回默认值b。这个 表达式a始终是可选类型。表达式b必须 匹配存储在a中的类型

但在您的示例中,您已经使用了可选绑定,因此无需将
与optional一起使用,如果条件失败,则会自动分配
nil

let val = something["something"] as? String ?? nil

这里,
something[“something”]as?字符串
,如果
某物[“某物”]
未能传递
字符串
,则已分配
nil
。因此,这里不需要此运算符。

当表达式或变量生成可选结果时,此运算符通常用于提供默认值。例如:

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
您可以将这些操作符中的多个链接为:

let value3 = j ?? i ?? 9 //value3 will be 5 non-optional
只要找到非nil值,链就会终止。表达式的结果将是可选/非可选的,具体取决于链中最后一个表达式的类型


您提供的示例虽然在语法上是正确的,但它是多余的,因为省略了
??nil
将不会对结果产生任何结果。

它被称为nil合并运算符,但如果传递
nil
,则没有任何意义。请注意,生成的对象将是可选的,这是一个
运算符,这意味着
。当可选值丢失时,可以使用此运算符。是的,这就是为什么没有必要将其写入
let val=something[“something”]作为?字符串!=无某物,某物!字符串:“默认值”
谢谢,我错过了,更新了答案。更新为
“默认值”
。谢谢
let value3 = j ?? i ?? 9 //value3 will be 5 non-optional