enum DatabaseError: Error {
case entryNotFound
case duplicatedEntry
case unexpected(reason: String)
}
struct User {
let id: Int
let name: String
}
// Result を返すパターン
func findUser() -> Result<User, DatabaseError> {
// ユーザを検索したが、見つからなかったと仮定する
return .failure(.entryNotFound)
}
let result = findUser()
switch result {
case .success(_):
print("success")
case let .failure(error):
switch error {
case .entryNotFound:
print("entry not found")
case .duplicatedEntry:
print("duplicated entry")
case .unexpected(let reason):
print("unexpected: \(reason)")
}
}
// throw するパターン
func findUserWithThrowing() throws -> User {
throw DatabaseError.unexpected(reason: "不適切なユーザ")
// throw NSError(domain: "error", code: -1, userInfo: nil)
// return User(id: 1, name: "test user")
}
do {
let user = try findUserWithThrowing()
} catch DatabaseError.unexpected(let reason) {
print("unexpected: \(reason)")
}
参考:
Swift エラー処理の種類
【Swift 5.5】詳解 Result