exceptiontry-catchswift4swift-optionals

try? returns double optional in Swift 4


There are a lot of similar questions but no one describes how to handle exceptions with try? + double optional.

I know str1 doesn't generate exception. It is just an example:

let str1: String? = "some string"
let str2: String? = try? str1 //compilation error because "try? str1" returns object of type String??

One of the possible solutions is replace try? -> try:

let str1: String? = "some string"
let str2: String? = {
    do {
        return try str1
    } catch {
        return nil
    }
}()

But is it possible to preserve try? like the following?

let str2: String? = try? ...//do something with str1 in the same single line

P.S. In Swift 5 the initial code works but I need to something with it in Swift 4 (upgrading to Swift 5 requires significant changes in project)


Solution

  • Returning a double optional was the default behavior since Error Handling with do - try - catch was introduced in Swift 3.

    In Swift 5 SE 230: Flatten nested optionals resulting from 'try?' has been implemented.

    upgrading to Swift 5 requires significant changes in project

    Do it, it's worth it. The changes are less dramatic than from Swift 2 to 3