Swift でエラー型にローカライズされた説明を提供するにはどうすればよいでしょうか? 質問する

Swift でエラー型にローカライズされた説明を提供するにはどうすればよいでしょうか? 質問する

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

しかし、エラー型にキャストせずに動作させる方法はありますか?

ベストアンサー1

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.")

プロトコルを採用することで、エラーCustomNSErroruserInfo辞書(および)を提供できるようになります。例: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

おすすめ記事