Function throws AND returns optional.. possible to conditionally unwrap in one line?

后端 未结 2 1410
时光取名叫无心
时光取名叫无心 2020-12-11 18:41

I am using an SQLite library in which queries return optional values as well as can throw errors. I would like to conditionally unwrap the value, or receive nil if it return

相关标签:
2条回答
  • 2020-12-11 19:23

    I like Martin's answer but wanted to show another option:

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

    This has the advantage of working outside of if, guard, or switch statements. The type specifier Any? isn't necessary but just included to show that it returns an optional:

    let value: Any? = (try? getSomething()) ?? nil
    
    0 讨论(0)
  • 2020-12-11 19:34

    Update: As of Swift 5, try? applied to an optional expression does not add another level of optionality, so that a “simple” optional binding is sufficient. It succeeds if the function did not throw an error and did not return nil. val is then bound to the unwrapped result:

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

    (Previous answer for Swift ≤ 4:) If a function throws and returns an optional

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

    then try? getSomething() returns a "double optional" of the type Value?? and you have to unwrap twice:

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

    Here the first binding let optval = ... succeeds if the function did not throw, and the second binding let val = optval succeeds if the return value is not nil.

    This can be shortened with case let pattern matching to

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

    where val?? is a shortcut for .some(.some(val)).

    0 讨论(0)
提交回复
热议问题