首页 > 解决方案 > 将数据从 json 模型传输到数组

问题描述

是否可以将 int 和 string 值都保存在数组中?我需要帮助。我从 JSON API 中提取数据。但我无法将一些变量转移到数组中。

我的模型是:

struct Input: Codable {
    let name: String
    let species: Species
    let gender: Gender
    let house, dateOfBirth: String
    let yearOfBirth: YearOfBirth
    let ancestry, eyeColour, hairColour: String
    let wand: Wand
    let patronus: String
    let hogwartsStudent, hogwartsStaff: Bool
    let actor: String
    let alive: Bool
    let image: String
}



enum YearOfBirth: Codable {
    case integer(Int)
    case string(String)

    init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        if let x = try? container.decode(Int.self) {
            self = .integer(x)
            return
        }
        if let x = try? container.decode(String.self) {
            self = .string(x)
            return
        }
        throw DecodingError.typeMismatch(YearOfBirth.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for YearOfBirth"))
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.singleValueContainer()
        switch self {
        case .integer(let x):
            try container.encode(x)
        case .string(let x):
            try container.encode(x)
        }
    }
}

当我将 yearOfBirth 获取为字符串或整数数组时,它给出错误无法将类型“YearOfBirth”的值转换为预期的参数类型“字符串”

打印 yearOfBirth :

integer(1980)
integer(1979)
integer(1980)
integer(1980)
integer(1925)
integer(1977)
string("")
integer(1960)

标签: iosarraysjsonswift

解决方案


您将和值保存在一个数组中。IntString

要检索它们,假设您有let years = [YearOfBirth]

for year in years {
    switch year {
        case .string(let text): print(text) // You can handle texts here
        case .integer(let number): print(number) // You can handle numbers here
    }
}

此外,您可以将 all 转换为整数数组,例如:

let numbers: [Int] = years.compactMap { if case .integer(let number) = $0 { return number } else { return nil } }

推荐阅读