ios - 触发器抛出或重新抛出过滤函数中的错误

标签 ios arrays swift swift2

可能是什么触发器使过滤器函数 throwsrethrows 出错?
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/

相关文章:

ios - Swift-检测点击 NSMutableAttributedString

ios - ViewController - 全屏

iphone - JSON 雅虎财经图表数据 iOS 解析

python - 如何返回numpy结构化数组中多列的 View

ios - 无法将文件保存在 Swift 2 文档目录内的文件夹中

swift - 如何检测SKAction是否正在运行

ios - 界面生成器 : What are the UIView's Layout iOS 6/7 Deltas for?

ios - 应用关闭时截图

arrays - 搜索包含项目数组的项目等node.js

arrays - 通过添加 JSonObject 创建 JsonArray