如何解开double可选项?

如何解开double可选项?,第1张

如何解开double可选项?

给定一个double可选,如以下双重包装

String

let a: String?? = "hello"print(a as Any) // "Optional(Optional("hello"))n"

@Leo 表明您可以使用 可选绑定 两次:

if let temp = a, let value = temp {    print(value) // "hellon"}

或强制解开两次:

print(value!!)  // don't do this - you're just asking for a crash

您可以使用以下5种方法来安全解开double可选:

方法1:

您还可以使用 模式匹配

if case let value?? = a {    print(value) // "hellon"}

正如@netigger在回答中指出的那样,它也可以写成:

if case .some(.some(let value)) = a {    print(value) // "hellon"}

简洁性虽然较差,但较容易阅读。


方法2:

另外,您可以两次使用 nil合并运算符

??

print((a ?? "") ?? "")  // "hellon"

注意: 与此处介绍的其他方法不同,这将始终产生一个值。 如果任一可选参数为,则使用

""
(空
String
nil


方法3:

或者,您可以将 nil合并运算符

??
可选绑定一起使用

if let value = a ?? nil {    print(value)  // "hellon"}

这是如何运作的?

用双重包裹可选的,由变量保持的值可以是3件事情之一:

Optional(Optional("somestring"))
Optional(nil)
如果内可选的是
nil
,或
nil
如果外可选的是
nil
。因此,
??nil
将外部可选项解包。如果外部可选参数为
nil
,则将其
??
替换为默认值
nil
。如果
a
Optional(nil)
??
则将打开外部可选的包装
nil
。在这一点上,你将有一个
String?
就是
nil
如果任何内部或外部可选的
nil
。如果有
String
内部,则得到
Optional("somestring")

最后,如果两个可选参数中的任意一个为且跳过了该块,则 可选绑定

if let
)解开
Optional("somestring")
以获得
"some string"
可选绑定 失败
nil


方法4:

此外,您还可以使用

flatMap
带有 可选的结合

if let value = a.flatMap({ 方法5: }) {    print(value)  // "hellon"}

let a: String?? = "hello"let b: String??????? = "bye"if let value = a as? String {    print(value)  // "hellon"}print(b as Any)  // "Optional(Optional(Optional(Optional(Optional(Optional(Optional("bye")))))))n"if let value = b as? String {    print(value)  // "byen"}

有条件地将值强制转换为类型。令人惊讶的是,这将删除所有级别的可选选项:



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5642144.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存