将 Alamofire 与 .publishDecodable 结合使用
Using Alamofire with .publishDecodable
我需要将 .publishDecodable 与 Result 一起使用,我遵循了 instructions,但是我 运行 遇到了这个错误:“无法推断出通用参数 't' 闭包”。 =13=]
@Published var loginModel: [LoginModel] = [LoginModel]()
var cancellation: AnyCancellable?
func request<T: Codable>(_ url: String, method: HTTPMethod = .get, headers: HTTPHeaders? = nil, parameters: Codable? = nil) -> AnyPublisher<Result<T, AFError>, Never> {
let publisher = AF.request(url, method: method, headers: headers)
.validate()
.publishDecodable(type: T.self)
return publisher.result()
}
func login(email: String, password: String) {
let parameters = LoginParameters(
email: email,
password: password
)
cancellation = request(serverURL + "login", method: .post, parameters: parameters)
.sink { [self] response in
switch response {
case .success:
loginModel = response.value()
case .failure(error):
print(error)
}
}
}
您应该帮助编译器推断 T
类型提供您期望的 response
类型。例如,您对 request(_:method:headers:parameters:)
函数的调用可能如下所示:
cancellation = request(serverURL + "login", method: .post, parameters: parameters)
.sink { [self] (response: Result<[LoginModel], AFError>) in
switch response {
case .success(let value):
self.loginModel = value
case .failure(let error):
print(error)
}
}
或者,如果您愿意,可以像这样指定 request(_:method:headers:parameters:)
函数的 return 类型:
let publisher: AnyPublisher<Result<[LoginModel], AFError>, Never>
publisher = request(serverURL + "login", method: .post, parameters: parameters)
cancellation = publisher.sink { [self] response in
switch response {
case .success(let value):
self.loginModel = value
case .failure(let error):
print(error)
}
}
我需要将 .publishDecodable 与 Result 一起使用,我遵循了 instructions,但是我 运行 遇到了这个错误:“无法推断出通用参数 't' 闭包”。 =13=]
@Published var loginModel: [LoginModel] = [LoginModel]()
var cancellation: AnyCancellable?
func request<T: Codable>(_ url: String, method: HTTPMethod = .get, headers: HTTPHeaders? = nil, parameters: Codable? = nil) -> AnyPublisher<Result<T, AFError>, Never> {
let publisher = AF.request(url, method: method, headers: headers)
.validate()
.publishDecodable(type: T.self)
return publisher.result()
}
func login(email: String, password: String) {
let parameters = LoginParameters(
email: email,
password: password
)
cancellation = request(serverURL + "login", method: .post, parameters: parameters)
.sink { [self] response in
switch response {
case .success:
loginModel = response.value()
case .failure(error):
print(error)
}
}
}
您应该帮助编译器推断 T
类型提供您期望的 response
类型。例如,您对 request(_:method:headers:parameters:)
函数的调用可能如下所示:
cancellation = request(serverURL + "login", method: .post, parameters: parameters)
.sink { [self] (response: Result<[LoginModel], AFError>) in
switch response {
case .success(let value):
self.loginModel = value
case .failure(let error):
print(error)
}
}
或者,如果您愿意,可以像这样指定 request(_:method:headers:parameters:)
函数的 return 类型:
let publisher: AnyPublisher<Result<[LoginModel], AFError>, Never>
publisher = request(serverURL + "login", method: .post, parameters: parameters)
cancellation = publisher.sink { [self] response in
switch response {
case .success(let value):
self.loginModel = value
case .failure(let error):
print(error)
}
}