RxNetworks
RxNetworks copied to clipboard
想问下 如果向支持codeable 怎么操作哦
public struct ApiResponse<T: Codable>: Codable {
public var code: Int
public var message: String?
public var data: T?
public var isSuccess: Bool {
return 200 ..< 300 ~= code
}
public init(code: Int = -100010, message: String? = nil, data: T? = nil) {
self.code = code
self.message = message
self.data = data
}
public static func onErrorRecover(_ err: Swift.Error)-> SharedSequence<DriverSharingStrategy, ApiResponse<T>> {
let __err = err as NSError
return Driver<ApiResponse<T>>.just(ApiResponse<T>(code: __err.code, message: __err.localizedDescription))
}
}
public extension Observable where Element: Any {
@discardableResult
func decode<T: Codable>(_ type: T.Type) -> Observable<T> {
return self.map { element -> T in
let decoder = JSONDecoder()
// 反序列化日期, 根据业务情况, 自行修改
decoder.dateDecodingStrategy = .iso8601
// 或者自定义, 参考`DateDecodingStrategy`
// let formatter = DateFormatter()
// formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
// decoder.dateDecodingStrategy = .custom({ decoder-> Date in
// let container = try decoder.singleValueContainer()
// let dateStr = try container.decode(String.self)
//
// let date = formatter.date(from: dateStr)
// return date!
// })
let data = try JSONSerialization.data(withJSONObject: element)
let result = try decoder.decode(T.self, from: data)
return result
}
}
}
用法
Api.detail
.request(plugins: [
NetworkLoadingPlugin()
])
.decode(ApiResponse<YOURMODEL>.self)
扩展
/// https://github.com/Flight-School/AnyCodable
public typealias ApiRespAny = ApiResponse<AnyCodable>
public extension ApiRespAny {
var dict: [String: Any]? {
return self.result as? [String: Any]
}
var result: Any? {
return self.data?.value
}
}
用法
Api.detail
.request(plugins: [
NetworkLoadingPlugin()
])
.decode(ApiRespAny.self)
好的 谢谢了
最近又新写了一个关于Codable的库HollowCodable可以参考使用! 回头我看看兼容问题,写一个关于Codable的插件供大家使用。