量子价值
首先,您可以定义一个可以从String
and Int
价值。
这里是。
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
}
}
Person
现在你可以像这样定义你的结构
struct Person: Decodable {
let id: QuantumValue
}
就是这样。我们来测试一下吧!
JSON 1: id
is String
let data = """
{
"id": "123"
}
""".data(using: String.Encoding.utf8)!
if let person = try? JSONDecoder().decode(Person.self, from: data) {
print(person)
}
JSON 2: id
is Int
let data = """
{
"id": 123
}
""".data(using: String.Encoding.utf8)!
if let person = try? JSONDecoder().decode(Person.self, from: data) {
print(person)
}
更新 1 比较值
这个新段落应该回答评论中的问题。
如果您想将量子值与Int
您必须记住,量子值可能包含Int
or a String
.
所以问题是:比较 a 意味着什么?String
and an Int
?
如果您只是在寻找一种将量子值转换为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
UPDATE 2
这部分是为了回答评论者留下的评论@Abrcd18.
您可以将此计算属性添加到Person
struct.
var idAsString: String {
switch id {
case .string(let string): return string
case .int(let int): return String(int)
}
}
现在要填充标签只需写
label.text = person.idAsString
希望能帮助到你。