【LocalizedError】エラーの定義方法の一例を紹介

この記事は約7分で読めます。

LocalizedErrorプロトコルを使用すると、カスタムエラータイプにローカライズされたエラーメッセージを簡単に提供したりすることが出来ます。

以下に、LocalizedErrorプロトコルの使い方を説明します。

エラーの定義

エラーを定義するには、色々な書き方があります。今回はシンプルで内容が理解しやすい書き方で定義してみます。

LocalizedErrorプロトコルを準拠するカスタムエラータイプを定義します。errorDescriptionプロパティを実装して、エラーメッセージをローカライズします。

ポイント

  • LocalizedErrorに適合したenumでエラー一覧を定義する
  • プロパティとして”errorDescription”などエラーを特定するために必要な情報を用意する
enum LErrorSmp: LocalizedError {
    // エラーの一覧を定義
    case ErrorTypeA
    case ErrorTypeB
    case ErrorTypeC
    
    // エラーの説明
    public var errorDescription: String? {
        switch self {
        case .ErrorTypeA:
            return NSLocalizedString("Error A", comment: "")
        case .ErrorTypeB:
            return NSLocalizedString("Error B", comment: "")
        case .ErrorTypeC:
            return NSLocalizedString("Error C", comment: "")
        }
    }
}

エラーのスロー

定義したカスタムエラータイプを使用してエラーをスローする関数を作成します。

func ErrorA() throws {
    throw LErrorSmp.ErrorTypeA
}

エラーの処理方法

エラーを処理する際に、LocalizedErrorプロトコルに準拠したエラータイプであれば、localizedDescriptionプロパティを使用してローカライズされたエラーメッセージを取得できます。

do {
    try ErrorA()
} catch let error {
    print(error.localizedDescription)
}

サンプルコード

上記のポイントを踏まえて、サンプルコードを作成してみます。
errorDescriptionやfailureReasonなどに関しては、文字列として取得することも可能です。

import SwiftUI

struct LocalizedErrorSmp: View {
    @State private var error: LErrorSmp? = nil
    var body: some View {
        // 各ボタンをタップすると対応するエラーメッセージを格納する
        Button("Error Type A") {
            error = .ErrorTypeA
            do {
                try ErrorA()
            } catch let error {
                print(error.localizedDescription)
            }
        }
        Button("Error Type B") {
            error = .ErrorTypeB
        }
        Button("Error Type C") {
            error = .ErrorTypeC
        }
        
        // エラーのクリアボタン
        Button("Clear Error") {
            error = nil
        }
        .padding()
        
        // セットしたエラーの説明を表示
        HStack {
            Text("Error Description:")
            Text(error?.errorDescription ?? "No Error")
        }
    }
    
    //エラーのスロー用
    func ErrorA() throws {
        throw LErrorSmp.ErrorTypeA
    }
    func ErrorB() throws {
        throw LErrorSmp.ErrorTypeB
    }
    func ErrorC() throws {
        throw LErrorSmp.ErrorTypeC
    }
}

enum LErrorSmp: LocalizedError {
    // エラーの一覧を定義
    case ErrorTypeA
    case ErrorTypeB
    case ErrorTypeC
    
    // エラーの説明
    public var errorDescription: String? {
        switch self {
        case .ErrorTypeA:
            return NSLocalizedString("Error A", comment: "")
        case .ErrorTypeB:
            return NSLocalizedString("Error B", comment: "")
        case .ErrorTypeC:
            return NSLocalizedString("Error C", comment: "")
        }
    }
    // エラーの発生理由
    public var failureReason: String? {
        switch self {
        case .ErrorTypeA:
            return NSLocalizedString("Button A Tapped", comment: "")
        case .ErrorTypeB:
            return NSLocalizedString("Button B Tapped", comment: "")
        case .ErrorTypeC:
            return NSLocalizedString("Button C Tapped", comment: "")
        }
    }
    // エラーからの復帰方法
    public var recoverySuggestion: String? {
        switch self {
        case .ErrorTypeA:
            return NSLocalizedString("Tap Clear Error", comment: "")
        case .ErrorTypeB:
            return NSLocalizedString("Tap Clear Error", comment: "")
        case .ErrorTypeC:
            return NSLocalizedString("Tap Clear Error", comment: "")
        }
    }
}

まとめ

エラーの定義方法やエラーハンドリングに関して、一例を紹介しました。

LocalizedErrorプロトコルを使用することで、アプリケーション内のエラーメッセージを簡単にローカライズできます。これにより、ユーザーがアプリケーションを自分の言語に翻訳する場合でも、適切なメッセージが表示されるようになります。

エラーの実装方法に関しては、設計思想等によって様々な方法が考えられますので、上記の方法が必ずしも正しいというわけではありません。あくまでも一例として参考としていただけますと幸いです。

タイトルとURLをコピーしました