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でエラー処理を記述する事ができます。
0 件のコメント :
コメントを投稿