[Swift] Result型の使い時

Swift 5.0からResult型が導入されました。(最近知りました。)
Result型を使うタイミングについて調べていたら、Manual Propagation, Automatic Propagationと言う言葉が出てきて勉強になりました。
Result型はManual Propagetionで使う物になります。
(参考URLにわかりやすく説明されています。)

Result型とは

何か処理を行ったときの結果をsuccess, failureの2種類で表せる型です。
HTTPアクセスしてダウンロードする処理の結果判定処理などに使えます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// エラーを定義
enum ActionError: Error {
    case notAllow
}
 
func sampleHttpRequest(type: Int, completionHandler: @escaping (Result<Int, ActionError>) -> Void) {
    if type == 0 {
        // 失敗したとき
        completionHandler(.failure(.notAllow))
        return
    }
 
    // 処理...
 
    // 成功したとき
    completionHandler(.success(7))
}
 
// 使い方
sampleHttpRequest(type: 0) { result in
    switch result {
    case .success(let val):
        print("action result: \(val)")
    case .failure(let error):
        print(error.localizedDescription)
    }
}

処理が成功した時、失敗した時の処理を上記のように処理できます。
結論から言うと、非同期処理のコールバックで処理を行い時にResult型を使うと良さそうです。

Manual Propagation, Automatic Propagation

項目 説明
Manual Propagation 言語の機能でエラーハンドリングする。if, switchエラーを処理する
Automatic Propagation エラーをthrowして、呼び出し元でcatchしてエラー処理する

参考URLにわかりやすい説明がありますが、私の理解としては Automatic Propagationは通常のエラー処理において処理を簡潔に書く事ができます。
(エラーになったらthrowして呼び出し元でエラーの処理を行う)
Automatic Propagationでの処理が難しい場合(非同期処理のコールバックなど) は、Manual Propagationでエラー処理を書くとスッキリかける。

PromiseKitを使っている場合、Promiseの処理の中でエラーをthrowできるので、Automatic Propagationでエラー処理を記述する事ができます。

参考URL

0 件のコメント :

コメントを投稿