繁体   English   中英

如何将 nil 传递给 Swift 上的泛型类型参数?

[英]How can I pass nil to generic type parameter on Swift?

我正在使用 Alamofire5 和 Swift 5.7.x。

当我从 API 服务器收到响应数据时出现问题。

响应数据默认为:

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

但是“items”属性可以是任何数据类型。 null,字符串,整数,数组,object..

我正要解决使用 Generics。但我不知道如何处理 null。

是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..
            }
        }

我怎样才能将 nil 传递给调用者?

考虑到您对所有 API 请求都有以下回复

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

你的 Codable 结构如下

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..
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM