gpt4 book ai didi

swift - 可以同时实现 Void 和 Codable 的泛型

转载 作者:可可西里 更新时间:2023-11-01 01:07:05 25 4
gpt4 key购买 nike

这里我有一个用于 api 结果的结构

struct Response<Result> {
let status: Int
let message: String
let result: Result
}

现在通常让这个符合 Codable将意味着 Result对象需要是 Codable .这样做看起来像以下之一

struct Response<Result: Codable>: Codable {...}

// or

extension Response: Codable where Result: Codable {}

我遇到的问题是某些响应没有 result key ,我希望能够使用 ResponseVoid 类似的对象改为输入 Response<Void>很像这样so question .

目前我有一个可能的方法来解决这个问题,只需声明另一个 Response输入没有 result它里面的变量是这样的:

struct BaseResponse {
let status: Int
let message: String
}

有没有办法解决这个问题,这样我就不必声明另一个 Response类型?


我尝试过以下操作,但没有任何效果

  1. 我不符合VoidCodable
  2. Result: Void处有另一个符合可编码的扩展
extension Response: Codable where Result: Codable {}

extension Response: Codable where Result: Void {}
  1. Never也不会工作,因为它没有自己的初始值设定项,因此我无法使其符合 Codable
  2. 创建 Nothing符合 Codable 的类型像这样
struct Nothing: Codable, Hashable {
init() {}

static var nothing: Nothing { return .init() }
}

所以我可以像这样使用响应

let response: Response<Nothing> = Response(
status: 200,
message: "Success",
result: .nothing
)

or

public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.status = try container.decode(forKey: .status)
self.message = try container.decode(forKey: .message)

// These lines don't work.
if let result = try container.decodeIfPresent(Result.self, forKey: .result) {
self.result = result
} else {
self = .nothing
}
}

但问题是我不能有 decodeIfPresent特定于 Nothing 的方法类型。就这么多。

最佳答案

您可以定义您的 init(from:)像这样的方法:

init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)

status = try container.decode(Int.self, forKey: .status)
message = try container.decode(String.self, forKey: .message)

if Result.self is Nothing.Type {
result = Nothing() as! Result
} else {
result = try container.decode(Result.self, forKey: .result)
}
}

你检测到你在 Response<Nothing> 中case 并完全跳过结果的解码。这样你就可以保持正常 result在需要结果的情况下进行解码并且可以将其保留为非可选。

关于swift - 可以同时实现 Void 和 Codable 的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56866758/

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