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

46qrfjad  于 2023-01-08  发布在  Swift
关注(0)|答案(1)|浏览(113)

我正在对JSON进行解码,其中一个值可以是IntString,我在网上找到了这段代码(并编辑了它),告诉我如何将它设置为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")
有什么办法可以解决这个问题吗?

new9mtju

new9mtju1#

首先,你的标题是错误的。在这个故事中没有“原始值”。这实际上是有意义的,因为你不能把一个原始值当作一个变量来设置。你找到的是一个枚举,它有一个带有关联值的case。
第二,你的期望是错误的,如果我们把一个字符串解码成你的枚举,你得到的仍然不是字符串;它是一个枚举,带有一个字符串关联值。
所以,问题可能仅仅在于你不知道如何“提取"字符串或整数,也就是说,不知道如何提取一个关联的值,答案是:请使用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。
[By方法:这几乎就是Optionals的工作方式。Optional("hello")实际上是一个枚举case,它具有一个关联值Optional.some("hello")。我想您可能会想知道。]

相关问题