3 回答
TA贡献1816条经验 获得超4个赞
如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 domain和code)。例:
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
TA贡献1802条经验 获得超4个赞
我还要补充一下,如果你的错误有这样的参数
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" }}
TA贡献1810条经验 获得超5个赞
使用结构可以是一种替代方案。静态本地化有点优雅:
import Foundationstruct MyError: LocalizedError, Equatable { private var description: String! init(description: String) { self.description = description } var errorDescription: String? { return description } public static func ==(lhs: MyError, rhs: MyError) -> Bool { return lhs.description == rhs.description }}extension MyError { static let noConnection = MyError(description: NSLocalizedString("No internet connection",comment: "")) static let requestFailed = MyError(description: NSLocalizedString("Request failed",comment: ""))}func throwNoConnectionError() throws { throw MyError.noConnection}do { try throwNoConnectionError()}catch let myError as MyError { switch myError { case .noConnection: print("noConnection: \(myError.localizedDescription)") case .requestFailed: print("requestFailed: \(myError.localizedDescription)") default: print("default: \(myError.localizedDescription)") }}
- 3 回答
- 0 关注
- 979 浏览
添加回答
举报