如何解开返回为以下内容的字符串:
(可选(可选“蓝色”))
var cityName = String() if let cityAnno = annotation as MGLAnnotation! { cityName = String(stringInterpolationSegment: cityAnno.title!) } cityLabelName.text = ("\(cityName), \(county)")
cityLabelName打印为 (Optional "New York")
(Optional "New York")
给定一个double可选,如以下双重包装String:
String
let a: String?? = "hello" print(a as Any) // "Optional(Optional("hello"))\n"
@Leo 表明您可以使用 可选绑定 两次:
if let temp = a, let value = temp { print(value) // "hello\n" }
或强制解开两次:
print(value!!) // don't do this - you're just asking for a crash
您可以使用以下5种方法来安全解开double可选:
方法1:
您还可以使用 模式匹配 :
if case let value?? = a { print(value) // "hello\n" }
正如@netigger在回答中指出的那样,它也可以写成:
if case .some(.some(let value)) = a { print(value) // "hello\n" }
简洁性虽然较差,但较容易阅读。
方法2:
另外,您可以两次使用 nil合并运算符 ??:
??
print((a ?? "") ?? "") // "hello\n"
注意: 与此处介绍的其他方法不同,这将始终产生一个值。 如果任一可选参数为,则使用""(空String)nil。
""
nil
方法3:
或者,您可以将 nil合并运算符 ??与 可选绑定一起使用 :
if let value = a ?? nil { print(value) // "hello\n" }
这是如何运作的?
用双重包裹可选的,由变量保持的值可以是3件事情之一:Optional(Optional("some string")),Optional(nil)如果内可选的是nil,或nil如果外可选的是nil。因此,?? nil将外部可选项解包。如果外部可选参数为nil,则将其??替换为默认值nil。如果a是Optional(nil),??则将打开外部可选的包装nil。在这一点上,你将有一个String?就是nil如果任何内部或外部可选的nil。如果有String内部,则得到Optional("some string")。
Optional(Optional("some string"))
Optional(nil)
?? nil
a
String?
Optional("some string")
最后,如果两个可选参数中的任意一个为且跳过了该块,则 可选绑定 (if let)解开Optional("some string")以获得"some string"或 可选绑定 失败nil。
if let
"some string"
方法4:
此外,您还可以使用flatMap带有 可选的结合 :
flatMap
if let value = a.flatMap({ $0 }) { print(value) // "hello\n" }
方法5:
有条件地将值强制转换为类型。令人惊讶的是,这将删除所有级别的可选选项:
let a: String?? = "hello" let b: String??????? = "bye" if let value = a as? String { print(value) // "hello\n" } print(b as Any) // "Optional(Optional(Optional(Optional(Optional(Optional(Optional("bye")))))))\n" if let value = b as? String { print(value) // "bye\n" }