我怎样把nil传递给Swift上的泛型类型参数?

hkmswyz6  于 2023-01-20  发布在  Swift
关注(0)|答案(1)|浏览(170)

我使用的是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..
            }
        }

我怎样才能把零传给呼叫者呢?

zengzsys

zengzsys1#

考虑到您对所有API请求的响应如下

{
    statusCode: 200
    message: "OK"
    items: null
}

和您的可编码结构如下

struct Response<T: Codable>: Codable {
    var statusCode: Int
    var message: String
    var items: T? // Notice this is declared as Optional
}

由于你的items变量被声明为可选的,所以它可以像预期的那样工作,只需要很少的改变。
您可以声明一个Empty Struct,当您需要items键的null值时可以使用该结构,如下所示。

struct EmptyResponse: Codable {

}

可以按如下方式使用EmptyResponse结构:

API.shared.request("/users/device", method: .post, params: reqParam) { (response: Result<Response<EmptyResponse>, NetworkError>) in
            switch response {
            case .success(let data):
                debugPrint(data)
                if let items = data.items {
                    // Use items here
                } else {
                    // Items is nil
                }

            case .failure(let error):
                // some codes..
            }
        }

相关问题