意識的に使ったことが無かったので使ってみた。

開発環境

> xcodebuild -version 
Xcode 12.3
Build version 12C33

rethrows

例外を throw するクロージャを引数に取る場合、関数の定義に rethrows を定義する。
removeAll(where:)compactMap(_:) に使用されている。

使用例

compactMap(_:) で rethrows を体験する。

 

import Foundation

struct OddError: Error {}

let a = [0, 0, 1 ,0, 0]

let b = try! a.compactMap { num -> Int in
    if num % 2 == 1 {
        throw OddError()
    }
    return num * 2
}

print(b)

Fatal error: 'try!' expression unexpectedly raised an error: __lldb_expr_1.OddError():

try!try? にするとエラーが潰され、b には nil が入る。


import Foundation

struct OddError: Error {}

let a = [0, 0, 1 ,0, 0]

do {
    try a.compactMap { num -> Int in
        if num % 2 == 1 {
            throw OddError()
        }
        return num * 2
    }
} catch is OddError {
    print("奇数が入ってる!")
}

奇数が入ってる!

 

compactMap(_:) が引数に持つクロージャを実行し、そのクロージャ内で例外を throw するときに、実行側はcompactMap(_:) 自体が throw した風に見える。
throw するのが直下でない場合のエラーハンドリングをシンプルに書けることがメリットに感じた。

参考