【问题标题】:Swift ?? on a type迅捷??在一个类型上
【发布时间】:2016-07-25 12:15:35
【问题描述】:

我知道是什么??是用作运算符时,但是当它在类型上时是什么意思?

我的项目中有一个名为 MyStruct 的结构,并且特定 var 的自动完成告诉我它的类型为 MyStruct??

不确定这意味着什么或如何安全地打开它。

【问题讨论】:

  • 它是Optional<Optional<MyStruct>>,一个“可选的可选MyStruct”。
  • 嵌套选项:Optional(Optional(value))。打开两次。
  • 典型示例UIApplicationDelegate.window,一个可选属性,可以包含一个可选项。或者索引一个可选的字典。
  • 安全解包:var myStruct: MyStruct?? = MyStruct()if let middleOpt = myStruct, myStruct = middleOpt{}

标签: swift


【解决方案1】:

正如其他人所说,它是一个双重 Optional,与 nil 合并运算符 (??) 完全无关。

要解开它,你只需解开一个常规的可选项,两次:

let doubleOptional: MyStruct?? = MyStruct()

guard let singleOptional = doubleOptional else {
    //first unwrapping failed
}

guard let wrappedValue = singleOptional else {
    //second unwrapping failed
}

//use wrappedValue

这些并不常见,但有时它们很有用。

例如,假设您有一个存储数组平均值的数据结构。该数组可能为空,因此应允许平均值为nil,以表示没有平均值。假设计算这个平均值非常昂贵,我们想将它存储在缓存层中。这个缓存层可以有一个代表该平均值的双选项。如果值为Optional.None(即nil),我们知道缓存还没有值,因此需要计算。如果值为Optional.Some(Optional.None),我们知道缓存有一个值,但没有有效的平均值(即数组为空。最后,该值可能是Optional.Some(Optional.Some(/*...*/)),表示有效平均值的有效缓存值.

【讨论】:

  • 谢谢。当您考虑它时,这是有道理的。我有一个可能返回错误或可能返回结果的任务。该结果可能有一些价值或可能为零。所以结果是???。反正现在排序。谢谢
  • 它是网络框架的一部分。错误是返回到完成块的服务器错误。否则会这样做。
猜你喜欢
  • 2019-10-08
  • 2021-08-31
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多