gpt4 book ai didi

swift - 函数抛出并返回可选的.. 可以有条件地在一行中解包吗?

转载 作者:搜寻专家 更新时间:2023-11-01 05:33:41 26 4
gpt4 key购买 nike

我正在使用一个 SQLite 库,其中查询返回可选值并可能抛出错误。我想有条件地解包该值,或者如果返回错误则接收 nil。我不太确定如何表达这个,这段代码会解释,这就是它的样子:

func getSomething() throws -> Value? {
//example function from library, returns optional or throws errors
}


func myFunctionToGetSpecificDate() -> Date? {
if let specificValue = db!.getSomething() {
let returnedValue = specificValue!
// it says I need to force unwrap specificValue,
// shouldn't it be unwrapped already?

let specificDate = Date.init(timeIntervalSinceReferenceDate: TimeInterval(returnedValue))
return time
} else {
return nil
}

}

有没有办法避免在那里强制解包?在更新到 Swift3 之前,我并没有被迫在这里强制解包。

下面是实际的代码。只是试图从所有条目中获取最新的时间戳:

func getLastDateWithData() -> Date? {
if let max = try? db!.scalar(eventTable.select(timestamp.max)){

let time = Date.init(timeIntervalSinceReferenceDate: TimeInterval(max!))

// will max ever be nil here? I don't want to force unwrap!
return time

} else {
return nil
}
}

最佳答案

更新:自 Swift 5 应用于可选表达式的 try? 不会添加另一级别的可选性,因此“简单”可选绑定(bind)就足够了。如果函数没有抛出错误并且没有返回 nil,则它会成功。 val 然后绑定(bind)到展开的结果:

if let val = try? getSomething() {
// ...
}

(Swift ≤ 4 的先前答案:) 如果一个函数抛出 并且 返回一个可选的

func getSomething() throws -> Value? { ... }

然后 试试? getSomething() 返回一个“双重可选”的输入 Value?? 并且你必须解包两次:

if let optval = try? getSomething(), let val = optval {

}

这里第一个绑定(bind) let optval = ... 如果函数执行成功不抛出,第二个绑定(bind) let val = optval 成功如果返回值不是 nil

这可以通过 case let 模式匹配来缩短

if case let val?? = try? getSomething() {

}

val??.some(.some(val)) 的快捷方式。

关于swift - 函数抛出并返回可选的.. 可以有条件地在一行中解包吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47468508/

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