我正在嘗試開發支持閉包、異步和組合功能的通用網路層。
我希望網路層不依賴任何庫。
協議:
import Combine
import Foundation
protocol NetworkService {
// Closure
func get<ResponseModel>(endpoint: String,
response: ResponseModel.Type,
completion: @escaping (Result<ResponseModel, Error>) -> Void) where ResponseModel: Decodable
// Async
func get<ResponseModel>(endpoint: String,
response: ResponseModel.Type) async -> Result<ResponseModel, Error> where ResponseModel: Decodable
// Combine
func get<ResponseModel>(endpoint: String,
response: ResponseModel.Type) -> AnyPublisher<Result<ResponseModel, Error>, Never> where ResponseModel: Decodable
}
在 Alamofire 中實作協議時,出現錯誤。
執行:
import Alamofire
import Combine
import Foundation
final class AlamofireService: NetworkService {
let session: Session
// Encoder and Decoder
let encoder = JSONEncoder()
let decoder = JSONDecoder()
init() {
session = Session()
}
// Closure
func get<ResponseModel>(endpoint: String,
response: ResponseModel.Type,
completion: @escaping (Result<ResponseModel, Error>) -> Void) where ResponseModel: Decodable
{
session
.request(endpoint, method: .get)
.validate()
.responseDecodable(of: response, decoder: decoder) {
completion($0.result)
}
}
// Async
func get<ResponseModel>(endpoint: String,
response: ResponseModel.Type) async -> Result<ResponseModel, Error> where ResponseModel: Decodable
{
let result = await session
.request(endpoint, method: .get)
.validate()
.serializingDecodable(response, decoder: decoder)
.result
return result
}
// Combine
func get<ResponseModel>(endpoint: String,
response: ResponseModel.Type) -> AnyPublisher<Result<ResponseModel, Error>, Never> where ResponseModel: Decodable
{
let result = session
.request(endpoint, method: .get)
.validate()
.publishDecodable(type: response, decoder: decoder)
.result()
return result
}
}
錯誤:
閉包:無法將 'Result<ResponseModel, AFError>' 型別的值轉換為預期的引數型別 'Result<ResponseModel, any Error>'
異步:無法將“Result<ResponseModel, AFError>”型別的回傳運算式轉換為“Result<ResponseModel, any Error>”型別的回傳運算式
組合:無法將 'AnyPublisher<Result<ResponseModel, AFError>, Never>' 型別的回傳運算式轉換為回傳型別 'AnyPublisher<Result<ResponseModel, any Error>, Never>'
我的問題是如何將AFError轉換為Error?
uj5u.com熱心網友回復:
是的,編譯器只是不會自動為您轉換它。最簡單的轉換方法是使用mapError { $0 as Error }.
await session
.request(endpoint, method: .get)
.validate()
.serializingDecodable(response, decoder: decoder)
.result
.mapError { $0 as Error }
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/516372.html
上一篇:打字稿將嵌套陣列轉換為型別
