【问题标题】:What is the meaning of "??" in swift? [duplicate]是什么意思 ”??”迅速? [复制]
【发布时间】:2017-11-18 05:38:58
【问题描述】:

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

例如,let val = something["something"] as? String ?? nil

这到底是什么意思?这种语法有哪些用例?

【问题讨论】:

标签: swift syntax


【解决方案1】:

零合并运算符

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

let val = (something["something"] as? String) != nil ? (something["something"] as! String) : "default value"

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

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

a != 无?一种! :乙 上面的代码使用三元条件运算符和强制展开 (a!) 当 a 不为 nil 时访问包裹在 a 中的值,否则返回 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"

Nil-Coalescing Operator here部分

【讨论】:

  • let val = something["something"] as? String != nil ? something["something"] as! String : "default value"
  • 谢谢,我错过了,更新了答案。
  • 更新为"default value"。谢谢。
【解决方案2】:

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

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 不会对结果产生任何影响。

【讨论】:

    【解决方案3】:

    这是 Swift 中的 Nil-Coalescing Operator

    Nil-Coalescing Operator

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

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

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

    这里,something["something"] as? String,如果something["something"] 无法传递String,则已经分配nil。所以这里不需要这个运算符。

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 2015-01-22
      • 2020-10-27
      • 2015-07-15
      • 2018-07-17
      • 2012-08-13
      相关资源
      最近更新 更多