Swift “是什么意思?”&引用;斯威夫特?
我在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凝聚运算符是以下代码的简写:
将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