打开unwrapping nil可选

And*_*ing 2 error-handling try-catch optional swift2

请考虑以下代码:

enum MyErrorType:ErrorType {
    case BadTimes
}

var mightHaveAValue: String?

do {

    if let value = mightHaveAValue {
        // do stuff with value
    } else {
        throw MyErrorType.BadTimes
    }

    // do stuff with NSFileManager using mightHaveAValue which might throw

} catch {
    // handle error
}
Run Code Online (Sandbox Code Playgroud)

...我有一个大的do/try/catch块.在这种情况下,错误处理将是相同的,无论mightHaveAValue是空的还是NSFileManager稍后发生的坏事.因此,重用错误处理代码是有意义的.

这是Swift2中最干净的方法,还是有某种方法可以自动抛出/捕获一个没有值的可选项?

小智 7

也许只使用这样的扩展

extension Optional {

    func throwing() throws -> Wrapped {
        if let wrapped = self {
            return wrapped
        } else {
            throw NSError("Trying to access non existing value")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


aya*_*aio 6

它看起来没问题,但它更好,guard let而不是if let因为它允许你在主do块中使用未包装的值而不必在if let分支内工作.您还可以使用多个catch分支来处理不同的错误类型.

do {

    guard let value = mightHaveAValue else {
        throw MyErrorType.BadTimes
    }

    // do stuff with value

} catch let error as MyErrorType {
    // handle custom error
} catch let error as NSError {
    // handle generic NSError
}
Run Code Online (Sandbox Code Playgroud)

有没有自动的方式来处理展开自选,你必须使用的许多已知的方法之一:if let,guard let,无合并等