5

我正在使用一个 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
    }
}
4

2 回答 2

9

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

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

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

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

然后try? getSomething()返回类型的“双重可选”,Value??您必须解包两次:

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

}

let optval = ...如果函数没有抛出,则第一个绑定成功,let val = optval如果返回值不是,则第二个绑定成功nil

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

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

}

val??的快捷方式在哪里.some(.some(val))

于 2016-09-25T20:14:10.533 回答
0

我喜欢马丁的回答,但想展示另一种选择:

if let value = (try? getSomething()) ?? nil {

}

if这具有在、guardswitch语句之外工作的优点。类型说明符Any?不是必需的,只是包含它以表明它返回一个可选的:

let value: Any? = (try? getSomething()) ?? nil
于 2018-07-26T18:38:05.560 回答