当前位置: 首页 > 面试题库 >

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

习哲彦
2023-03-14
问题内容

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

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协议,错误可以提供userInfo字典(以及a 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


 类似资料:
  • 我正在使用Swift 3语法定义一个自定义错误类型,我想提供一个用户友好的错误描述,该错误由< code>Error对象的< code > localized description 属性返回。我该怎么做? 有没有办法让返回我的自定义错误描述(“错误的用户友好描述”)?请注意,此处的错误对象类型为,而不是。当然,我可以把物体扔到我的错误 但是有没有一种方法可以使它在不转换为我的错误类型的情况下工作

  • 问题内容: 我收到错误消息: 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删除,并且不可能知道