Swift 关于使用??给字典赋值

Swift 关于使用??给字典赋值,swift,dictionary,Swift,Dictionary,目前,我正在使用Swift跟踪nice book应用程序的开发,到目前为止,一切都非常棒。然而,在练习之后,我发现了一些我想更好理解的代码。我已经试着到处寻找信息,但我甚至不知道它的名字或如何找到它。因此,没有更多的话要说,以下是: 我有一本字典: var frequencyOfAnswers: [AnimalType: Int] = [:] AnymalType只是一个带有四个大小写的enum。然后他们对应答者的频率进行映射: let responseTypes = responses.ma

目前,我正在使用Swift跟踪nice book应用程序的开发,到目前为止,一切都非常棒。然而,在练习之后,我发现了一些我想更好理解的代码。我已经试着到处寻找信息,但我甚至不知道它的名字或如何找到它。因此,没有更多的话要说,以下是:

我有一本字典:

var frequencyOfAnswers: [AnimalType: Int] = [:]
AnymalType
只是一个带有四个大小写的
enum
。然后他们对应答者的频率进行映射:

let responseTypes = responses.map { $0.type }
A到目前为止一切都很好。但在下面的迭代中:

for response in responseTypes {
    frequencyOfAnswers[response] = (frequencyOfAnswers[response]
    ?? 0) + 1
}
我不能完全理解
的用法。我知道这里的要点是,如果新元素还没有进入字典,那么将被添加,它的值为1。如果它已经存在,那么它对应的整数值将增加1

我想了解更多关于这种语法的信息。如果你们中有人能给我提供一个好的文本、网页或解释,我将非常感谢


提前感谢。

被称为“零合并”操作符

非常简单,它检查一个可选变量以查看它是否有值,并且:

  • 如果是,则该值将展开并使用
  • 如果没有,则使用运算符右侧的值
例如:

var cheese: String?
var tomatoes = cheese ?? "bread"
在本例中,变量
tomatos
等于“bread”,因为变量
cheese
从未分配变量

如果您这样做了:

var cheese: String?
cheese = "lettuce"
var tomatoes = cheese ?? "bread"
现在西红柿等于莴苣,因为我们给了奶酪一个值。因为
cheese
是可选的,所以该值会自动展开(这意味着我们可以直接使用它的值)


如果您想了解更多有关它的信息,请查看。

被称为“nil coalescing”操作符

非常简单,它检查一个可选变量以查看它是否有值,并且:

  • 如果是,则该值将展开并使用
  • 如果没有,则使用运算符右侧的值
例如:

var cheese: String?
var tomatoes = cheese ?? "bread"
在本例中,变量
tomatos
等于“bread”,因为变量
cheese
从未分配变量

如果您这样做了:

var cheese: String?
cheese = "lettuce"
var tomatoes = cheese ?? "bread"
现在西红柿等于莴苣,因为我们给了奶酪一个值。因为
cheese
是可选的,所以该值会自动展开(这意味着我们可以直接使用它的值)


如果您想了解更多信息,请查看。

??是零合并运算符

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

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

a != nil ? a! : b
它用于为没有值的可选类型定义默认值。在您的示例中,它用于将frequencyOfAnswers字典值设置为0,以防frequencyOfAnswers字典对于给定的响应类型键没有值


更多信息,请参阅《无聚结运算符》一节??是零合并运算符

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

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

a != nil ? a! : b
它用于为没有值的可选类型定义默认值。在您的示例中,它用于将frequencyOfAnswers字典值设置为0,以防frequencyOfAnswers字典对于给定的响应类型键没有值


阅读更多信息,请参见Swift 4中的“无合并运算符”部分。您也可以在Swift 4中说
frequencyOfAnswers[response,default:0]+=1。请参见Swift 4中您也可以说
frequencyOfAnswers[response,default:0]+=1。抱歉,我们无意删除您的任何内容,只是添加了链接。我一定是指手画脚的。对不起,我不打算删除你的任何内容,只是附加了链接。我一定是摸到它了。