如何在Swift中使用Error类型提供本地化描述?

14 浏览
0 Comments

如何在Swift中使用Error类型提供本地化描述?

我正在使用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类型。当然,我可以将对象强制转换为MyError类型。

(error as? MyError)?.localizedDescription

但是否有一种不需要强制转换到我的错误类型就可以实现的方法?

admin 更改状态以发布 2023年5月24日
0
0 Comments

我也要补充一点,如果你的错误信息包含参数,比如下面这个:

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

你可以这样在本地化的描述中使用这些参数:

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

0
0 Comments

如 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.

如果错误被转换为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字典(以及一个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

0