当前位置: 首页 > 知识库问答 >
问题:

如何在Swift中提供带有错误类型的本地化描述?

干照
2023-03-14

我正在使用Swift 3语法定义一个自定义错误类型,我想提供一个用户友好的错误描述,该错误由< code>Error对象的< code > localized description 属性返回。我该怎么做?

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

有没有办法让本地化的描述返回我的自定义错误描述(“错误的用户友好描述”)?请注意,此处的错误对象类型为错误,而不是“我的错误”。当然,我可以把物体扔到我的错误

(error as? MyError)?.localizedDescription

但是有没有一种方法可以使它在不转换为我的错误类型的情况下工作?

共有3个答案

宦书
2023-03-14

现在有两个错误采用协议,您的错误类型可以采用它们,以便为 Objective-C 提供更多信息 —

enum MyBetterError : CustomNSError, LocalizedError {
    case oops

    // domain
    static var errorDomain : String { return "MyDomain" }
    // code
    var errorCode : Int { return -666 }
    // userInfo
    var errorUserInfo: [String : Any] { return ["Hey":"Ho"] };

    // localizedDescription
    var errorDescription: String? { return "This sucks" }
    // localizedFailureReason
    var failureReason: String? { return "Because it sucks" }
    // localizedRecoverySuggestion
    var recoverySuggestion: String? { return "Give up" }

}
叶华皓
2023-03-14

我还要补充一点,如果你的错误有这样的参数

enum NetworkError: LocalizedError {
  case responseStatusError(status: Int, message: String)
}

您可以在本地化描述中调用这些参数,如下所示:

extension NetworkError {
  public var errorDescription: String? {
    switch self {
    case .responseStatusError(status: let status, message: let message):
      return "Error with status \(status) and message \(message) was thrown"
  }
}

你甚至可以像这样把它变短:

extension NetworkError {
  public var errorDescription: String? {
    switch self {
    case let .responseStatusError(status, message):
      return "Error with status \(status) and message \(message) was thrown"
  }
}
张勇
2023-03-14

如 Xcode 8 测试版 6 发行说明中所述,

通过采用新的localized error协议,Swift定义的错误类型可以提供本地化的错误描述。

在您的情况下:

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协议,错误可以提供一个用户信息dictionary(以及一个域代码)。例子:

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
 类似资料:
  • 问题内容: 我正在使用Swift 3语法定义一个自定义错误类型,我想提供该对象的属性返回的错误的用户友好描述。我该怎么做? 有没有一种方法可以返回我的自定义错误描述(“错误的用户友好描述”。)?请注意,这里的错误对象是类型而不是。我当然可以将对象转换为MyError 但是有没有办法在不强制转换为我的错误类型的情况下使它工作? 问题答案: 如Xcode 8 beta 6发行说明中所述, Swift定

  • 问题内容: 我收到错误消息: org.hibernate.TypeMismatchException:为类BEntity提供了错误类型的ID。预期:类BEntity,得到类AEntity HQL查询: hibernate源代码 当我在SQL Explorer中运行代码时,只能在代码中运行它会导致问题… 问题答案: 看来这是hibernate3.2.6版中的一个缺陷,该缺陷仍未解决。碰到了这个JIR

  • 我正在尝试设置Spring Cloud Config Server。如何在Windowsapplication.properties中spring.cloud.config.server.git.uri? uri是这个D:\MicroservicesProject\git-localconfi-reso\test-service.properties 我试过这个 但是我收到此错误

  • 问题内容: 我正在学习将我的应用本地化为简体中文。我正在按照本教程进行操作。 因为本教程基于Obj-C,所以格式化后的字符串可以这样写: “你喜欢?” =“〜Es bueno?〜”; 但是我正在使用Swift。而且在Swift中,我认为您不能用来表示在那里放置了一些东西。我们有字符串插值对吗? 我的应用与数学有关。我想在表格视图单元格的详细标签中显示哪些输入用于计算结果。例如 此处的意思是“根据x

  • 问题内容: 在下面的代码片段中,如何初始化错误变量? 正如您在上面看到的,将在if-else块中使用。我想使用一个变量来获取结果,但是如何在这里初始化。谢谢! 问题答案: 您可以通过声明变量来创建零值错误(将为nil)。 这是一个常见的习惯用法,您将在大量代码中看到它。

  • 伴随对象为提供隐式 我的问题是:对象如何将提供给。 因为将被JVM删除,并且不可能知道