【问题标题】:Little explanation about an using of ?? to assign values to a dictionary关于使用的一点解释??为字典赋值
【发布时间】:2017-11-17 19:12:36
【问题描述】:

目前我正在关注这本好书 App Development with Swift,到目前为止,一切都被解释得很棒。然而,在练习之后,我发现了一些我很想更好地理解的代码。我已经尝试到处查找信息,但我什至不知道名称是什么或如何找到它。所以废话不多说,如下:

我有一本字典:

var frequencyOfAnswers: [AnimalType: Int] = [:]

AnymalType 只是一个 enum 有四个案例。然后他们对frequencyOfAnswers进行映射:

let responseTypes = responses.map { $0.type }

到目前为止一切都很好。但是在下面的迭代中:

for response in responseTypes {
    frequencyOfAnswers[response] = (frequencyOfAnswers[response]
    ?? 0) + 1
}

我无法完全理解?? 的用法。我知道这里的重点是,如果新元素尚未进入字典,那么将被添加并且它的值为 1。如果它已经存在,那么它对应的整数值将增加 1 .

我想了解有关此语法的更多信息。如果你们中的任何人能给我提供一个好的文字、网页或解释,我将非常感激。

提前谢谢你。

【问题讨论】:

  • here
  • 你也可以在 Swift 4 中说frequencyOfAnswers[response, default: 0] += 1

标签: swift dictionary


【解决方案1】:

?? 被称为“零合并”运算符。

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

  • 如果是,则解包并使用该值
  • 如果不是,则使用运算符右侧的值。

例如:

var cheese: String?
var tomatoes = cheese ?? "bread"

在这种情况下,变量 tomatoes 等于“面包”,因为变量 cheese 从未分配过变量。

如果你这样做了:

var cheese: String?
cheese = "lettuce"
var tomatoes = cheese ?? "bread"

现在tomatoes 等于“lettuce”,因为我们给了cheese 一个值。而且因为cheese 是可选的,所以值会自动解包(意味着我们可以直接使用它的值)。

如果您想了解更多信息,请查看Apple's documentation

【讨论】:

  • 抱歉,我无意删除您的任何内容,只是附加了链接。我一定是胖手指了。
【解决方案2】:

??是 Nil-Coalescing 运算符。

nil-coalescing 运算符 (a ?? b) 如果可选 a 包含值,则解包它,如果 a 为 nil,则返回默认值 b。表达式 a 始终是可选类型。表达式 b 必须与存储在 a 中的类型匹配。

nil-coalescing 运算符是以下代码的简写:

a != nil ? a! : b

用于为没有值的 Optional 类型定义默认值。在您的示例中,如果 frequencyOfAnswers 字典对给定的响应类型键没有值,则将其设置为 frequencyOfAnswers 字典值。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html 的 Nil-Coalescing Operator 部分了解更多信息

【讨论】:

    猜你喜欢
    • 2019-05-14
    • 2020-07-28
    • 1970-01-01
    • 2019-04-15
    • 2013-05-06
    • 1970-01-01
    • 2013-07-24
    • 2013-08-31
    • 1970-01-01
    相关资源
    最近更新 更多