swift2 触发器引发或重新引发筛选器函数中的错误

cwtwac6a  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(156)

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

wi3ka0sx

wi3ka0sx1#

“触发器”是闭包中存在的一些代码,这些代码可能会引发错误,即闭包中存在try
filter方法被定义为不仅接受可能抛出错误的闭包,而且重新抛出由其闭包抛出的任何错误。(即闭包具有try语句),然后您可以将整个filter Package 在它自己的do-try-catch模式中,以适当地处理其闭包可能引发的任何错误。

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

例如,假设您有一个Fraction类型,当您尝试在分母为零的情况下使用calculateValue时,该类型会抛出一些自定义的Error

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),那么就不必担心filter会重新抛出任何错误,而且根本不需要do-catch块:

let numbers = [0, 1, 2, 3, 4, 5]

let evenNumbers = numbers.filter { $0 % 2 == 0 }

有关Swift 2格式副本,请参阅以前的revision of this answer

相关问题