gpt4 book ai didi

swift - Generic Decodable 无需解码

转载 作者:行者123 更新时间:2023-11-28 14:11:01 25 4
gpt4 key购买 nike

我正在使用一种通用方法来解码 AlamoFire 生成的 JSONresponse。我的功能如下:

private func fetch<T: Swift.Decodable>(URLRequest: URLRequestConvertible) -> SignalProducer<T, NetworkError> {
return Network.request(URLRequest)
.attemptMap { JSON in
do {
let jsondata = try JSONSerialization.data(withJSONObject: JSON as! [String:Any], options: .prettyPrinted)
return .success(try JSONDecoder().decode(T.self, from: jsondata))
} catch let error {
Logger.shared.error("Error while decoding a JSON", error: error as NSError, userInfo: ["json" : JSON, "urlRequest" : URLRequest.urlRequest!.debugDescription])
return .failure(.incorrectDataReturned)
}
}
}

对于我的每个请求,我都创建了一个遵循 Decodable 协议(protocol)的结构。

对于一个请求,我不想解码 JSON,因为它的结构很复杂,而且我只需要在另一个请求中将它发回,我只想将响应保存在一个结构中,例如:

struct GenericResponse: Swift.Decodable {
let data: Data
}

其中数据是响应。所以,我只想获取响应并将其放入一个结构中,而无需进一步解码。

有没有可能不破坏我的功能的通用性?如果 T.self 属于某种类型,他们是否可以构建不解码的解码器?

最佳答案

如果您想避免对特定响应进行解码,您可以重载 fetch 函数来处理这种情况。

请参阅以下示例,其中重载了第二个获取方法以将响应数据保存在结构中,而不是经过解码过程。

typealias JSON = [String: Any]

protocol RawResponse {
init(data: Data)
}

// 1
func fetch<T: Decodable>(json: JSON) -> T? {
guard let jsonData = try? JSONSerialization.data(withJSONObject: json, options: []),
let response = try? JSONDecoder().decode(T.self, from: jsonData) else {
return nil
}
return response
}

// 2
func fetch<T: RawResponse>(json: JSON) -> T? {
guard let jsonData = try? JSONSerialization.data(withJSONObject: json, options: []) else {
return nil
}
return T(data: jsonData)
}

有了这个重载,如果响应 struct 符合 RawResponse 而不是 Decodable (因为我们不需要实际解码数据), fetch 重载被触发。

struct UserResponse: Decodable {
var username: String
}

let userJson: JSON = [
"username": "someUser"
]
let user: UserResponse? = fetch(json: userJson) // call fetch #1
user?.username // someUser


struct GenericResponse: RawResponse {
var data: Data
}

let notParsable: JSON = [
"someKey": "someValue"
]
let rawData: GenericResponse? = fetch(json: notParsable) // call fetch #2
rawData?.data // 23 bytes

关于swift - Generic Decodable 无需解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52540259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com