如何从字符串数组创建枚举值数组

时间:2019-02-18 07:38:55

标签: ios arrays swift enums

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

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

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

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

这是结构的一部分,

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

我当时正在成像,我可以映射数组并比较原始值,但是我不知道该怎么做,或者这是正确/可能的方法。

2 个答案:

答案 0 :(得分:2)

我想你有这样的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) }
    }

}

答案 1 :(得分:1)

您可以通过将当前字符串数组映射到基于其原始值的枚举案例数组来实现:

let array = ["music", "cars", "tomato"]
let arrayEnum = array.map { Products(rawValue: $0) }

此时,请记住,arrayEnum[Products?]包含3个元素,因为映射“ tomato”字符串会得到nil。您可以使用compactMap来摆脱nil:

let array = ["music", "cars", "tomato"]

let arrayEnum = array.compactMap { Products(rawValue: $0) }
print(arrayEnum)

现在arrayEnum仅包含两个元素,而没有nil一个。