可能是什么触发器使过滤器函数 throws
或 rethrows
出错?
someArray.filter(includeElement: (Self.Generator.Element) throws -> Bool )
最佳答案
“触发器”是闭包中存在的一些代码可以抛出错误,即闭包中有一个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
类型,当您在分母为零时尝试 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
block :
let numbers = [0, 1, 2, 3, 4, 5]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
有关 Swift 2 版本,请参阅之前的 revision of this answer .
关于ios - 触发器抛出或重新抛出过滤函数中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33273012/