什么可能是导致滤波器函数throws或rethrows出错的触发器?someArray.filter(includeElement: (Self.Generator.Element) throws -> Bool )
throws
rethrows
someArray.filter(includeElement: (Self.Generator.Element) throws -> Bool )
wi3ka0sx1#
“触发器”是闭包中存在的一些代码,这些代码可能会引发错误,即闭包中存在try。filter方法被定义为不仅接受可能抛出错误的闭包,而且重新抛出由其闭包抛出的任何错误。(即闭包具有try语句),然后您可以将整个filter Package 在它自己的do-try-catch模式中,以适当地处理其闭包可能引发的任何错误。
try
filter
do
catch
do { let result = array.filter { // some code with `try` in it here return success } } catch { print(error) }
例如,假设您有一个Fraction类型,当您尝试在分母为零的情况下使用calculateValue时,该类型会抛出一些自定义的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。
1条答案
按热度按时间wi3ka0sx1#
“触发器”是闭包中存在的一些代码,这些代码可能会引发错误,即闭包中存在
try
。filter
方法被定义为不仅接受可能抛出错误的闭包,而且重新抛出由其闭包抛出的任何错误。(即闭包具有try
语句),然后您可以将整个filter
Package 在它自己的do
-try
-catch
模式中,以适当地处理其闭包可能引发的任何错误。例如,假设您有一个
Fraction
类型,当您尝试在分母为零的情况下使用calculateValue
时,该类型会抛出一些自定义的Error
。然后,您可以执行以下操作:
显然,如果提供给
filter
的闭包没有抛出任何错误(即闭包中没有try
),那么就不必担心filter
会重新抛出任何错误,而且根本不需要do
-catch
块:有关Swift 2格式副本,请参阅以前的revision of this answer。