1. ホーム
  2. スイフト

[解決済み]SwiftでErrorタイプでローカライズされた説明を提供する方法は?

2022-04-15 01:25:35

質問

Swift 3 の構文でカスタムエラータイプを定義しています。 localizedDescription プロパティの Error オブジェクトを作成します。どうすればいいのでしょうか?

public enum MyError: Error {
  case customError

  var localizedDescription: String {
    switch self {
    case .customError:
      return NSLocalizedString("A user-friendly description of the error.", comment: "My error")
    }
  }
}

let error: Error = MyError.customError
error.localizedDescription
// "The operation couldn’t be completed. (MyError error 0.)"

の方法はありますか? localizedDescription は、私のカスタムエラー説明 ("エラーのユーザーフレンドリーな説明.") を返すのでしょうか?ここでのエラーオブジェクトの型は Error であって MyError . もちろん、このオブジェクトを MyError にキャストすることは可能です。

(error as? MyError)?.localizedDescription

しかし、私のエラータイプにキャストすることなく動作させる方法はあるのでしょうか?

どのように解決するのですか?

Xcode 8 beta 6 リリースノートに記載されているとおりです。

Swift で定義されたエラータイプは、新しい LocalizedError プロトコルを採用することで、ローカライズされたエラー説明を提供することができます。

あなたの場合

public enum MyError: Error {
    case customError
}

extension MyError: LocalizedError {
    public var errorDescription: String? {
        switch self {
        case .customError:
            return NSLocalizedString("A user-friendly description of the error.", comment: "My error")
        }
    }
}

let error: Error = MyError.customError
print(error.localizedDescription) // A user-friendly description of the error.

エラーが変換された場合、さらに多くの情報を提供することができます。 を NSError (これは常に可能です)。

extension MyError : LocalizedError {
    public var errorDescription: String? {
        switch self {
        case .customError:
            return NSLocalizedString("I failed.", comment: "")
        }
    }
    public var failureReason: String? {
        switch self {
        case .customError:
            return NSLocalizedString("I don't know why.", comment: "")
        }
    }
    public var recoverySuggestion: String? {
        switch self {
        case .customError:
            return NSLocalizedString("Switch it off and on again.", comment: "")
        }
    }
}

let error = MyError.customError as NSError
print(error.localizedDescription)        // I failed.
print(error.localizedFailureReason)      // Optional("I don\'t know why.")
print(error.localizedRecoverySuggestion) // Optional("Switch it off and on again.")

を採用することで CustomNSError プロトコルは、エラーが a userInfo ディクショナリ(また domaincode ). 例

extension MyError: CustomNSError {

    public static var errorDomain: String {
        return "myDomain"
    }

    public var errorCode: Int {
        switch self {
        case .customError:
            return 999
        }
    }

    public var errorUserInfo: [String : Any] {
        switch self {
        case .customError:
            return [ "line": 13]
        }
    }
}

let error = MyError.customError as NSError

if let line = error.userInfo["line"] as? Int {
    print("Error in line", line) // Error in line 13
}

print(error.code) // 999
print(error.domain) // myDomain