rethows 是 Swift 中非常重要的处理错误的方法。
如果一个函数A(例如map)的其中一个参数是一个函数类型B(map的闭包),且B有可能接受throw或不throw的函数,那么A就可以声明为rethrows,这时如果接受的B是不需要的throw的,就不用写do catch来处理错误,如果接受的是throw的才需要。
我们以 Swift 源代码中的 map 方法为例,来帮助我们理解 rethrows:
@inlinable
public func map(_ transform: (Element) throws -> T
) rethrows -> [T] {
//具体方法省略
}
在 map 函数的定义中,map 函数接受了一个可能产生错误的方法,但接受的方法也可能是不会产生错误的,比如:
let values = [2.0,4.0]
let squares = values.map { let values = [2.0,4.0]
do { let value = try values.map { * }} catch { print("error") }
* }
//返回4.0,16.0
由于 map 使用了 rethrows,当我们使用了不会产生错误的方法($0 * $0)时,就不用再写 do-catch 等处理错误的方法了。
假如我们把 map 的实现改成如下,将 rethrows 替换成 throws:
@inlinable
public func map(_ transform: (Element) throws -> T
) throws -> [T] {
//具体方法省略
}
则当我们调用上面乘法代码时,就必须写成:
多了一些无谓的代码。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)