gpt4 book ai didi

swift - 如何展开双重可选?

转载 作者:IT王子 更新时间:2023-10-29 05:05:30 27 4
gpt4 key购买 nike

如何打开返回的字符串:

(Optional(Optional "blue"))

var cityName = String()

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

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

cityLabelName 打印为 (Optional "New York")

最佳答案

给定一个双重可选,例如这个双重包装的 String:

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

@Leo,showed你可以使用可选绑定(bind)两次:

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 可选:

方法一:

您还可以使用模式匹配:

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

正如@netigger 在 their answer 中指出的那样,这也可以写成:

if case .some(.some(let value)) = a {
print(value) // "hello\n"
}

虽然不够简洁,但可能更容易阅读。


方法二:

或者,您可以使用 nil 合并运算符 ?? 两次:

print((a ?? "") ?? "")  // "hello\n"

注意:与此处介绍的其他方法不同,这将始终产生一个值。 ""(空 String)在任一个可选值是 nil 时使用。


方法三:

或者您可以使用 nil 合并运算符 ??可选绑定(bind):

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

这是如何运作的?

使用双重包装的可选值,变量持有的值可以是以下三种情况之一:Optional(Optional("some string")), Optional(nil) 如果内部可选为 nil,或 nil 如果外部可选为 nil。所以一个?? nil 展开外部可选。如果外部可选项为 nil,则 ?? 将其替换为默认值 nil。如果 aOptional(nil),那么 ?? 将解开外部可选,留下 nil。此时,如果内部可选或外部可选为 nil,您将得到一个 String?nil。如果里面有一个 String,你会得到 Optional("some string")

最后,可选绑定(bind) (if let) 解包Optional("some string") 得到"some string"optional binding 失败,如果任一个 optionals 为 nil 并跳过该 block 。


方法四:

此外,您可以使用 flatMap可选绑定(bind):

if let value = a.flatMap({ $0 }) {
print(value) // "hello\n"
}

方法五:

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

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"
}

关于swift - 如何展开双重可选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33049246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com