我正在对JSON进行解码,其中一个值可以是Int
或String
,我在网上找到了这段代码(并编辑了它),告诉我如何将它设置为int或string:
enum StrOrInt: 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 sot.missingValue
}
enum sot: Error {
case missingValue
}
}
这段代码可以工作,但是假设它正在解码一个字符串"test string"
,我希望结果是"test string"
,但结果是string("test string")
。
有什么办法可以解决这个问题吗?
1条答案
按热度按时间new9mtju1#
首先,你的标题是错误的。在这个故事中没有“原始值”。这实际上是有意义的,因为你不能把一个原始值当作一个变量来设置。你找到的是一个枚举,它有一个带有关联值的case。
第二,你的期望是错误的,如果我们把一个字符串解码成你的枚举,你得到的仍然不是字符串;它是一个枚举,带有一个字符串关联值。
所以,问题可能仅仅在于你不知道如何“提取"字符串或整数,也就是说,不知道如何提取一个关联的值,答案是:请使用
if case let
语句。所以,如果你已经解码到你的枚举中,它被称为
si
:这将打印
.string
case中的值,如果这个 * 是 * 字符串case。[By方法:这几乎就是Optionals的工作方式。
Optional("hello")
实际上是一个枚举case,它具有一个关联值Optional.some("hello")
。我想您可能会想知道。]