触发在过滤器函数中抛出或重新抛出错误

时间:2015-10-22 03:40:28

标签: ios arrays swift swift2

可能导致过滤器功能throwsrethrows出错的触发器是什么? someArray.filter(includeElement: (Self.Generator.Element) throws -> Bool )

1 个答案:

答案 0 :(得分:3)

"触发"在闭包内是否存在一些可能引发错误的代码,即闭包内有一个try

filter方法被定义为不仅接受可能引发错误的闭包,而且还重新抛出其闭包引发的任何错误。因此,如果使用带有抛出错误的闭包调用filter(即闭包有try语句),则可以将整个filter包装在自己的do中 - try - catch模式可以优雅地处理其闭包可能抛出的任何错误。

do {
    let result = array.filter {
        // some code with `try` in it here
        return success
    }
} catch {
    print(error)
}

例如,让我们假设您有一些Fraction类型,当您分母为零时尝试Error时会抛出一些自定义calculateValue

enum MathError: Error {
    case divideByZero
}

struct Fraction {
    let numerator: Int
    let denominator: Int

    func calculateValue() throws -> Double {
        if denominator == 0 {
            throw MathError.divideByZero
        }

        return Double(numerator) / Double(denominator)
    }
}

然后您可以执行以下操作:

let fractions = [
    Fraction(numerator: 1, denominator: 3),
    Fraction(numerator: 5, denominator: 7),
    Fraction(numerator: 4, denominator: 0)
]

do {
    let biggerThanOneHalf = try fractions.filter {
        try $0.calculateValue() > 0.5
    }
    print(biggerThanOneHalf)
} catch {
    print(error)
}

显然,如果你提供给filter的闭包没有抛出任何错误(即闭包中没有try),那么你不必担心{{ 1}}重新抛出任何东西,根本不需要filter - do块:

catch

对于Swift 2的演绎,请参阅之前的revision of this answer