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

标签 swift swift3 error-handling nslocalizedstring

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

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-defined error types can provide localized error descriptions by adopting the new LocalizedError protocol.

在你的情况下:

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 协议(protocol),错误可以提供 一个 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

关于swift - 如何在 Swift 中提供带有错误类型的本地化描述?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39176196/

相关文章:

ios - 如何使用 Swift 3 在本地化条件下更改按钮字体大小

php - 如何将move_uploaded_file的错误记录到文件中

android - 由于 AndroidManifest.xml 存在问题,无法构建 APK

vb6 - 你为什么要使用 "On Error Goto 0"?

ios - 在 Swift 中触摸 SKSpriteNode 时无法激活代码

ios - 清除角标(Badge)图标而不清除通知

ios - 更改 NSAttributedString 的字体大小

swift - 在 viewDidAppear 中快速淡入数据

ios - 从特定的 childViewControllers 类调用方法

swift - 歧义类型推断