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

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

(error as? MyError)?.localizedDescription

但是有没有一种方法可以让它在不影响我的错误类型的情况下工作呢?

推荐答案

正如Xcode 8 beta 6发行说明中所述,

通过采用新的LocalizedError协议,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.

如果错误被转换,您可以提供更多信息

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协议,错误可以提供

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宏向 struct 体及其init函数添加新成员?

Swift:iVar + Equatable上的协议约束

是否可以循环遍历SWIFT子类并访问它们的静态变量S?

如何偏移HStack中的视图,但仍然约束框架以与偏移匹配?

Swift 扩展:通过方法重载增强现有类

为什么我不能在这个 Swift 间接枚举中返回 self ?

关闭 SwiftUI TabView 中的子视图

如何使 onKeyPress 与 TextField 快速配合使用?

为什么 SwiftUI 中 ForEach 的这个 Select 不起作用?

我怎样才能缩短(提高效率)这段代码?

Swift // Sprite Kit:类别位掩码限制

如何删除 macOS 中的所有命令?

SwiftUI 中的计时器崩溃屏幕

Vapor Swift 如何配置客户端连接超时

Xcode swift ui 错误KeyPathComparator仅在 macOS 12.0 或更高版本中可用

macOS 守护进程应该由Command Line ToolXcode 模板制作吗?

理解 Swift 2.2 Select 器语法 - #selector()

使用自定义相机拍照 iOS 11.0 Swift 4. 更新错误

subscribeOn 和 observeOn 的顺序重要吗?

应用程序包不包含有效标识符