打开unwrapping nil可选

时间:2015-10-01 08:26:19

标签: error-handling try-catch swift2 optional

请考虑以下代码:

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
}

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

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

2 个答案:

答案 0 :(得分:6)

看起来没问题,但使用guard let代替if let会更好,因为它允许您使用主do块中的展开值,而不必在{{1}内工作1}}分支。您还可以使用多个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 } if let,无合并等。

答案 1 :(得分:0)

也许只是使用像这样的扩展名>

extension Optional {

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