Result型、エラーハンドリングのメモ

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