RxNetworks icon indicating copy to clipboard operation
RxNetworks copied to clipboard

想问下 如果向支持codeable 怎么操作哦

Open Delevel1020 opened this issue 1 year ago • 1 comments

Delevel1020 avatar Apr 28 '24 09:04 Delevel1020

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)

cdoky avatar Apr 29 '24 03:04 cdoky

好的 谢谢了

Delevel1020 avatar May 23 '24 09:05 Delevel1020

最近又新写了一个关于Codable的库HollowCodable可以参考使用! 回头我看看兼容问题,写一个关于Codable的插件供大家使用。

yangKJ avatar Jun 11 '24 09:06 yangKJ