gpt4 book ai didi

ios - 如何在 Codable 类型中使用 Any

转载 作者:IT王子 更新时间:2023-10-29 05:16:17 24 4
gpt4 key购买 nike

我目前在我的项目中使用 Codable 类型并遇到问题。

struct Person: Codable
{
var id: Any
}
上述代码中的

id可以是StringInt。这就是 id 类型为 Any 的原因。

我知道 Any 不是 Codable

我需要知道的是如何让它发挥作用。

最佳答案

量子值

首先,您可以定义一个可以从 StringInt 值中解码的类型。在这里。

enum QuantumValue: Decodable {

case int(Int), string(String)

init(from decoder: Decoder) throws {
if let int = try? decoder.singleValueContainer().decode(Int.self) {
self = .int(int)
return
}

if let string = try? decoder.singleValueContainer().decode(String.self) {
self = .string(string)
return
}

throw QuantumError.missingValue
}

enum QuantumError:Error {
case missingValue
}
}

现在你可以像这样定义你的结构

struct Person: Decodable {
let id: QuantumValue
}

就是这样。让我们测试一下!

JSON 1:idString

let data = """
{
"id": "123"
}
""".data(using: String.Encoding.utf8)!

if let person = try? JSONDecoder().decode(Person.self, from: data) {
print(person)
}

JSON 2:idInt

let data = """
{
"id": 123
}
""".data(using: String.Encoding.utf8)!

if let person = try? JSONDecoder().decode(Person.self, from: data) {
print(person)
}

更新 1 比较值

This new paragraph should answer the questions from the comments.

如果您想将量子值与 Int 进行比较,您必须记住量子值可以包含 IntString.

所以问题是:比较 StringInt 是什么意思?

如果您只是在寻找一种将量子值转换为 Int 的方法,那么您可以简单地添加此扩展

extension QuantumValue {

var intValue: Int? {
switch self {
case .int(let value): return value
case .string(let value): return Int(value)
}
}
}

现在你可以写了

let quantumValue: QuantumValue: ...
quantumValue.intValue == 123

更新 2

这部分是为了回答@Abrcd18留下的评论。

您可以将此计算属性添加到 Person 结构中。

var idAsString: String {
switch id {
case .string(let string): return string
case .int(let int): return String(int)
}
}

现在填充标签只是写

label.text = person.idAsString

希望对您有所帮助。

关于ios - 如何在 Codable 类型中使用 Any,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48297263/

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