はじめに
エラー処理について3にパターン分けて記事を投稿する。
①Optional型 >>>>> 成功時は値を返し、失敗時はnilを返す
②Result型 >>>>> 成功時は値を返し、失敗時はエラーの値(詳細)を返す
③do-catch文によるエラー処理
今回は②について記載する。
下記URLの続編である。
https://qiita.com/RammaruIshii/items/6c6015daa7583384695d
詳細
- Result型のエラー処理
- 成功時は値を返し、失敗時はエラーの値(詳細)を返す
- failureを表すときは対象の構造体などにErrorプロトコルを準拠させるルールがある。(Results型のfailureにwhereでErrorプロトコルを準拠するよう指示されている、気が向いたときにでも見てみてください)
Swift
//IDが登録(データが見つからない)されていない時はエラー処理(エラー詳細あり)をする
//今回のfailer時にお世話になるerror列挙体さん
enum DatabaseError: Error {
//データが見つからないエラー
case entryNotFound
//重複したデータによるエラー
case duplicatedEntry
//不正データによるエラー
case invalidEntry(reason: String)
}
//Resultのsuccess時に返す構造体
struct User {
let id: Int
let name: String
let email: String
}
//戻り値でResult<success, failer>型のエラー処理をしているため、失敗時、retrunで .failureを返している
func findUser(byID id: Int) -> Result<User, DatabaseError> {
let users = [
User(id: 1, name: "山本太郎", email: "yamamoto@dmail.com"),
User(id: 2, name: "青木小太郎", email: "aoki@gmail.com")
]
for user in users {
if user.id == id {
return.success(user)
}
}
return .failure(.entryNotFound)
}
//該当しないidをぶち込んでみる
let id = 0
let results = findUser(byID: id)
//switch文使って、これら全てのエラー(Result型のfailureですね)に対して網羅的にエラー時の動作を実装している
switch results {
//ここの.successはUser型である。また、Result型のsuccessは型引数の連想型なので、ここのuserは自分で決めれる引数名
case let .success(user):
print(".success\(user)")
//ここの.failureはDatabaseError型である。また、Result型のfailureは型引数の連想型なので、ここのerrorも自分で決めれる引数名
case let .failure(error):
switch error {
case .entryNotFound:
print(".failure: .entryNotFound")
case .duplicatedEntry:
print(".failure: .duplicatedEntry")
case .invalidEntry(reson: let reason):
print(".failure: .invalidEntry(\(reason)")
}
}
//出力
//失敗の場合 .failure: .entryNotFound
//ただし成功時の場合(idを1にするなど)は下記が出力される
//.successUser(id: 1, name: "山本太郎", email: "yamamoto@dmail.com")
おわりに
修正箇所等あればご指摘ください。
参考記事
[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)
↑引用元
石川 洋資 (著), 西山 勇世 (著)
発行者:片岡 巌
出版社:技術評論社
印刷/製本:日経印刷株式会社
開発環境
- Xcode-13.4.1
- Swift version 5.7