Avatar
omochimetaru 9/17/2020 5:56 AM
互換性の話の対象がズレてそう。
5:58 AM
まず前提として、 func loadData(file: String) throws IOError -> Data { ... } func main(files: [String]) throws IOError { // loadDataの IOError が .map から返ってきて欲しい try files.map { try loadData(file: $0) } } (edited)
5:59 AM
で、こうなるためには extension Array { func map<U>(_ f: (Element) throws -> U) rethrows -> [U] } ↑このrethrowsは、throwsのところのエラー型を投げる、としたいけど
6:03 AM
extension Array { func map<U>(_ f: (Element) throws -> U) rethrows -> [U] { var ret: [U] = [] for i in indices { let x = self[i] do { ret.append(try f(x)) } catch (error) { throw ArrayMapError(index: i, element: x, underlyingError: error) } } return ret } }
6:03 AM
↑例えばこのコードは従来はコンパイルできたけど、 rethrows を同じエラー型を投げる仕様にしてしまったら、コンパイルできなくなっちゃう。