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プロトコルを使用することで、アプリケーション内のエラーメッセージを簡単にローカライズできます。これにより、ユーザーがアプリケーションを自分の言語に翻訳する場合でも、適切なメッセージが表示されるようになります。
エラーの実装方法に関しては、設計思想等によって様々な方法が考えられますので、上記の方法が必ずしも正しいというわけではありません。あくまでも一例として参考としていただけますと幸いです。

