我正在尝试模拟我正在消耗的API可能返回的错误以及可能的网络错误。
我正在努力弄清楚是否应该使用Struct/Class
方法,其中每种类型的错误都建模为Struct/Class
或Enum
方法。
以下是需要考虑的一些注意事项:
media-types
(因此不同的JSON)返回不同的错误。所以我的错误有不同的属性。我不想将请求响应公开为简单的JSON对象/字典。httpStatusCode
属性(对于与无连接相关的错误,它将为nil)sync
次调用(用于throws
)和async
调用(用作完成块中的参数)使用相同的错误主要是因为第一个要求,很难弄清楚如何沿着Enum
方向前进。但也许我错过了一些东西,也许仍有一些力量存在于我不知道的Enum
类型中。
任何建议都将受到高度赞赏。
答案 0 :(得分:0)
根据您的最终目标(我有点不清楚),您可以对Struct
/ Class
和Enum
进行组合。
E.g。您可以创建一个包含您信息的Struct
,然后创建一个Enum
,其值为Struct
。另外,如果需要,您可以在Enum
中创建功能。 Swift中的Enums
中有很多功能。
如果您愿意,还可以根据其他Enum
制作具体的Enum
值,甚至更改每个值所依赖的Struct
/ Class
。
有关Enums
的更多信息,请查看apples documentation。
答案 1 :(得分:0)
通常 enum
是处理 Swift 错误的最佳方法。要提供不同的类型,您可以使用关联值,对于本地化描述,您可以为枚举实现 LocalizedError
协议,例如:
enum NetworkError : Error, LocalizedError {
case noInternet
case httpStatus(Int)
case unknown(Error)
public var errorDescription: String? {
switch self {
case .noInternet:
return "No Internet"
case .httpStatus(let code):
return "HTTP status code: \(code)"
case .unknown(let error):
return "Error: \(error)"
}
}
}
let err1 = NetworkError.noInternet
print(err1.localizedDescription)
let err2 = NetworkError.httpStatus(404)
print(err2.localizedDescription)
let err3 = NetworkError.unknown(error)
print(err3.localizedDescription)
/*
Prints:
No Internet
HTTP status code: 404
Error: error
*/
但如果您有错误的公共数据,您应该实现 struct
以保存您的错误类型所需的属性:
struct ResponseError: Error {
enum ErrorType {
case badStatusCode
case noJson
case invalidJson(Error)
}
let type: ErrorType
let statusCode: Int
}
let err = ResponseError(type: .badStatusCode, statusCode: 404)
从文档中阅读更多关于:https://developer.apple.com/documentation/swift/error