可能导致过滤器功能throws
或rethrows
出错的触发器是什么?
someArray.filter(includeElement: (Self.Generator.Element) throws -> Bool )
答案 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。