Полагаю, у вас есть 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) }
}
}