我使用的是Alamofire5和Swift 5.7.x。
从API服务器接收响应数据时出现问题。
响应数据默认值为:
{
statusCode: 200
message: "OK"
items: null
}
但是“项目”属性可以是任何数据类型。null、string、int、array、object ...
我想用泛型来解决,但是我不知道如何处理空值。
这是API通用代码:
struct Response<T: Codable>: Codable {
var statusCode: Int
var message: String
var items: T?
}
class API {
func request<Parameters: Encodable, T: Decodable>(_ path: String,
method: HTTPMethod = .get,
params: Parameters? = nil,
completion: @escaping (Result<Response<T?>, NetworkError>) -> Void) {
//some codes..
AF.request("\(path)",
method: method,
parameters: params,
encoder: JSONParameterEncoder.prettyPrinted
)
.validate(statusCode: 200..<400)
.validate(contentType: ["application/json"])
.responseData { response in
switch response.result {
case .success(let data):
guard let decodedData = try? JSONDecoder().decode(Response<T?>.self, from: data) else { return }
print(decodedData)
completion(.success(decodedData as Response<T?>))
case.failure(let error):
// some codes..
}
}
}
}
来电者:
API.shared.request("/users/device", method: .post, params: reqParam) { (response: Result<Response<This is the problem..!!>, NetworkError>) in
switch response {
case .success(let data):
print("userDevice updated")
debugPrint(data)
case .failure(let error):
// some codes..
}
}
我怎样才能把零传给呼叫者呢?
1条答案
按热度按时间zengzsys1#
考虑到您对所有API请求的响应如下
和您的可编码结构如下
由于你的items变量被声明为可选的,所以它可以像预期的那样工作,只需要很少的改变。
您可以声明一个Empty Struct,当您需要
items
键的null
值时可以使用该结构,如下所示。可以按如下方式使用
EmptyResponse
结构: