gpt4 book ai didi

swift - 如何从 Decodable 枚举中获取原始值?

转载 作者:行者123 更新时间:2023-11-28 05:54:11 26 4
gpt4 key购买 nike

我正在解码 JSON,我的值之一可以是 IntString。我在网上找到了这段代码(并对其进行了编辑)以了解如何制作它,以便它可以是一个 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/

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