swift2 在展开时抛出nil可选

rsl1atfo  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(232)

请考虑以下代码:

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稍后发生了一些不好的事情,错误处理都是一样的。所以重用错误处理代码是有意义的。
这是Swift 2中最干净的方法吗?还是有什么方法可以在展开一个没有值的可选项时自动抛出/捕获?

twh00eeo

twh00eeo1#

它看起来不错,但使用guard letif 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
}

没有自动的方法来处理展开选项,您必须使用许多已知方法中的一种:if letguard let、无聚结等。

tp5buhyn

tp5buhyn2#

也许可以使用这样的扩展名🤔

extension Optional {

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

相关问题