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 件のコメント :
コメントを投稿