一尘不染

如何解开double可选项?

swift

如何解开返回为以下内容的字符串:

(可选(可选“蓝色”))

var cityName = String()

if let cityAnno = annotation as MGLAnnotation! {
    cityName = String(stringInterpolationSegment: cityAnno.title!)
}

cityLabelName.text = ("\(cityName), \(county)")

cityLabelName打印为 (Optional "New York")


阅读 358

收藏
2020-07-07

共1个答案

一尘不染

给定一个double可选,如以下双重包装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"

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


方法3:

或者,您可以将 nil合并运算符 ??可选绑定一起使用

if let value = a ?? nil {
    print(value)  // "hello\n"
}

这是如何运作的?

用双重包裹可选的,由变量保持的值可以是3件事情之一:Optional(Optional("some string"))Optional(nil)如果内可选的是nil,或nil如果外可选的是nil。因此,?? nil将外部可选项解包。如果外部可选参数为nil,则将其??替换为默认值nil。如果aOptional(nil)??则将打开外部可选的包装nil。在这一点上,你将有一个String?就是nil如果任何内部或外部可选的nil。如果有String内部,则得到Optional("some string")

最后,如果两个可选参数中的任意一个为且跳过了该块,则 可选绑定if let)解开Optional("some string")以获得"some string"可选绑定 失败nil


方法4:

此外,您还可以使用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"
}
2020-07-07