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

标签 swift codable

我正在解码 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/

相关文章:

iOS 8 自动布局 - 视觉格式语言如何向 super View 边缘添加约束

ios - 可编码的 MKPolygon?

json - 如何在可编码解码过程中处理空数组

json - 如何从 JSON 对象 Swift 4 中检索值

xcode - 您可以使用 HLS 从 HTTPS 服务器流式传输吗?

ios - 按日期和字符对核心数据属性进行排序

ios - 如果字典数组缺少一个键,如何编写 Codable

swift - WrapperOfNSCoding 因单个值而失败

ios - 当用户开始在键盘上打字时如何获取字符键码?

ios - 应用程序在远程设备中不知不觉地崩溃