我正在解码 JSON,我的值之一可以是 Int
或 String
。我在网上找到了这段代码(并对其进行了编辑)以了解如何制作它,以便它可以是一个 int 或一个字符串:
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")
。
有办法解决这个问题吗?
最佳答案
首先,你的标题是错误的。这个故事中没有“原始值(value)”。这实际上是有道理的,因为您不能将原始值设置为变量。您发现的是一个枚举,其中包含具有关联值的案例。
其次,你的期望是错误的。如果我们将字符串解码为您的枚举,您拥有的仍然不是字符串;它是一个带有字符串关联值的枚举。
所以问题可能仅仅是您不了解如何提取字符串或 int,即如何提取关联值。答案是:使用 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
case 持有的值,如果这是字符串 case。
[顺便说一句:这几乎就是 Optionals 的工作方式。 Optional("hello")
实际上是一个带有关联值的枚举,Optional.some("hello")
。只是觉得你想知道。]
关于swift - 如何从 Decodable 枚举中获取原始值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51958464/