【问题标题】:How can I safety unwrap an optional with a default value using `coalescing unwrapping` - Not workig - Swift如何使用`coalescing unwrapping`安全地解开具有默认值的可选 - 不工作 - Swift
【发布时间】:2019-10-25 12:11:49
【问题描述】:

如何安全地从arrayOfStrings 中解开第一个可选项目,以使用coalescing unwrapping 获得默认值为0 的pounds

根据下面的代码,我想要的是能够获得5,但如果这是空的,则分配0作为默认值,例如如果measurement"lb. 8oz."我想要@987654327 @ 得到 0 的值。

在以下示例中,我确实得到了5,但如果我将measurement"5lb. 8oz." 更改为"lb. 8oz.",它就会崩溃

let measurement = "5lb. 8oz."

let arrayOfStrings:[String] = measurement.components(separatedBy: "l")
print("Array of Strings: \(arrayOfStrings)") //Output: Array of Strings: ["5", "b. 8oz."]

let pounds = Double(arrayOfStrings[0] ?? "0") 
print("Pounds \(pounds!)") //Output: Pounds 5.0

错误:将measurement更改为"lb. 8oz."

致命错误:在展开可选值时意外发现 nil

仅供参考 - 我正在寻找单行解决方案,我知道如何使用 if letguard

【问题讨论】:

  • 如果您不反对使用 Foundation,那么简单的 let pounds = (measurement as NSString).doubleValue 就可以解决问题。

标签: swift optional unwrap


【解决方案1】:

你可以解开数组的访问到Double的转换

let pounds = Double(arrayOfStrings.first ?? "0") ?? 0.0

【讨论】:

  • 我收到错误let pounds = Double(arrayOfStrings.first ?? "0") ?? 0.0 错误:`错误:无法强制解开非可选类型'Double'的值`
  • @fs_tigre 您确定错误是指该行吗? pounds 在此解决方案中不再是可选的,因此您无法再打开它
  • @fs_tigre 不,当你有一个可选的变量/属性时,你正在调用一个属性或方法。 var array: [String]?; array?.count
  • @fs_tigre,不,这不是可选链接。可选链接是当您在可选之后放置一个?,然后继续访问成员或调用其上的函数。请参阅this answer 了解可选链接的示例。
  • @fs_tigre 如果数组为空 .first 将返回 nil 但 [0] 将崩溃。如果你想访问这样的数组,[0]、[1] 等,你最好先检查数组的长度。此外,由于 [0] 不是可选的,因此执行 [0] ?? "0" 毫无意义,因为 ?? "0" 部分将永远不会被执行
【解决方案2】:
let pounds = Double(arrayOfStrings[0]) ?? 0.0
print("Pounds \(pounds)")

为我工作。

【讨论】:

  • 它确实有效......我以为我之前尝试过但它没有用。谢谢。
  • 只要数组不为空就可以正常工作
  • 是的,你完全正确。事实上使用 .first 比索引 [0] 会更好。
猜你喜欢
  • 2015-03-02
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2017-09-05
  • 1970-01-01
  • 2021-10-08
相关资源
最近更新 更多