给定一个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"}
有条件地将值强制转换为类型。令人惊讶的是,这将删除所有级别的可选选项:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)