[Swift] Result型の使い時

Swift 5.0からResult型が導入されました。(最近知りました。) Result型を使うタイミングについて調べていたら、Manual Propagation, Automatic Propagationと言う言葉が出てきて勉強になりました。 Result型はManual Propagetionで使う物になります。 (参考URLにわかりやすく説明されています。) ## Result型とは 何か処理を行ったときの結果をsuccess, failureの2種類で表せる型です。 HTTPアクセスしてダウンロードする処理の結果判定処理などに使えます。 ```objc `gutter:true; // エラーを定義 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](https://github.com/mxcl/PromiseKit)を使っている場合、Promiseの処理の中でエラーをthrowできるので、Automatic Propagationでエラー処理を記述する事ができます。 ## 参考URL - [Swift 5 のResultに備える](https://qiita.com/koher/items/7e92414082476fb87b76#%E3%81%84%E3%81%A4-result-%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%8D%E3%81%8B)

0 件のコメント :

コメントを投稿