如何从可解码枚举中获取原始值?迅速

时间:2018-08-22 00:44:01

标签: swift string

我正在快速解码json,我的值之一可以是IntString。我在网上找到了此代码(并对其进行了编辑),以了解如何制作该代码,使其可以是整数或字符串:

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 个答案:

答案 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")的枚举案例。只是以为您想知道。]