gpt4 book ai didi

swift - 零合并 : Using optional types as default value in Swift

转载 作者:行者123 更新时间:2023-11-30 10:19:41 25 4
gpt4 key购买 nike

我有这个:

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

dispatch_async(queue, {
if let data = NSURLConnection.sendSynchronousRequest(self.buildRequestForVenueLocation(location, identifier), returningResponse: &response, error: &error) {
let responseDictionary: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: .allZeros, error:&error) ?? error?.localizedDescription
dispatch_async(dispatch_get_main_queue(), {
completion(venues: responseDictionary, error: error)
})
} else {
println("There was a problem with the request...")
}
})

我的问题特别是关于这一行:

let responseDictionary: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: .allZeros, error:&error) ?? error?.localizedDescription

这是nil合并的正确用法吗?

根据 Apple 的文档,这是等效的:

a != nil ? a! : b

如果 a 为 nil,则返回 b,但是如果 b 是可选类型,那么有关系吗?

编辑

如果有人想知道,这是我调用该函数时的样子:

v.performVenueLocationRequest(l.location, identifier: "4d4b7105d754a06374d81259") {
if let result = $0 as? [String: AnyObject] ?? $1 {
println(result)
}
}

最佳答案

这取决于你所说的“事情”是什么意思。它会起作用的。它可能不是您想要的 - 如果 b 是可选的,那么结果也将是可选的,即即使 a 有一个值,它仍然不会被解包:

let a: Int? = 2
let b: Int? = 3
let c = i ?? j
// c is {Some 2}

对比:

let i: Int? = nil
let j: Int? = 3
let k = i ?? j
// k is {Some 3}

参见this article可能比您想知道的更多,但简而言之:结果必须在编译时固定为特定类型,无论 ab 的值是什么正在运行时。由于 b 是可选的,因此 a! 隐式包装在可选中以使两种类型兼容。这么说吧 - 如果结果不是可选的,并且 bnil,结果会是什么?

请记住,您可以链接??,这样您就可以在末尾放置第三个不可选的值,这将使结果不可选。

关于swift - 零合并 : Using optional types as default value in Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27767428/

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