我正在快速解码json,我的值之一可以是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")
。
有没有办法解决这个问题?
任何帮助将不胜感激。
答案 0 :(得分:1)
首先,您的标题是错误的。这个故事中没有“原始价值”。这实际上是有道理的,因为您不能像设置变量一样设置原始值。您发现的是一个包含带有关联值的案例的枚举。
第二,您的期望是错误的。如果我们将字符串解码为您的枚举,则您所拥有的仍然不是字符串;这是一个带有字符串关联值的枚举。
因此,问题可能可能只是您不了解如何提取字符串或整数(即如何提取关联的值)。答案是:使用if case let
语句。
因此,如果您已将其解码为枚举,并且称为si
:
if case StrOrInt.string( let s ) = si {
// if we get here, `si` was holding a string
// and `s` is now that string
print(s)
}
如果此是字符串大小写,则将打印.string
大小写保留的值。
[顺便说一句:这几乎就是Optionals的工作方式。 Optional("hello")
实际上是带有关联值Optional.some("hello")
的枚举案例。只是以为您想知道。]