首页 > 解决方案 > 如何从字符串数组创建枚举值数组

问题描述

我有一个从 API 返回的字符串数组。这些字符串是可用产品的列表。

我想在我的应用程序中使用枚举来表示这些数据。但是,我不确定这是否可能。

enum Products: String {
    case music
    case cars
    case sport
}

我收到的一个示例数组可能是["music", "cars"]

这是一个结构的一部分

struct CustomerState: Codable {
    var products = [Product]()
}

我正在成像我可以映射数组并可能比较原始值,但是我无法弄清楚如何做到这一点,或者这是否是正确/可能的方法。

标签: iosarraysswiftenums

解决方案


我想你有这样的json

let data = Data("""
{
"products" : [ "music", "cars" ]
}
""".utf8)

然后你可以实现Codable你的枚举

struct CustomerState: Codable {
    var products = [Products]()
}

enum Products: String, Codable {
    case music
    case cars
    case sport
}

然后你可以解码Data

do {
    let decoded = try JSONDecoder().decode(CustomerState.self, from: data)
    //print(decoded.products[0])
} catch { print(error) }

或者,如果 json 总是不必包含刚刚声明的枚举案例,您可以使用解码器创建自定义初始化程序,该解码器解码字符串数组,然后尝试从这些字符串创建枚举值。如果此原始值的大小写不存在,则不附加

struct CustomerState: Decodable {

    var products = [Products]()

    enum CodingKeys: String, CodingKey {
        case products
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let products = try container.decode([String].self, forKey: .products)
        self.products = products.compactMap { Products(rawValue: $0) }
    }

}

推荐阅读