ios - 如何从字符串数组创建枚举值数组
问题描述
我有一个从 API 返回的字符串数组。这些字符串是可用产品的列表。
我想在我的应用程序中使用枚举来表示这些数据。但是,我不确定这是否可能。
enum Products: String {
case music
case cars
case sport
}
我收到的一个示例数组可能是["music", "cars"]
这是一个结构的一部分
struct CustomerState: Codable {
var products = [Product]()
}
我正在成像我可以映射数组并可能比较原始值,但是我无法弄清楚如何做到这一点,或者这是否是正确/可能的方法。
解决方案
我想你有这样的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) }
}
}
推荐阅读
- c++ - 来自法线贴图的opengl奇怪输出
- javascript - TypeError:无法读取未定义的属性“本地时间”
- node.js - 通过 mailgun api 发送电子邮件
- ssh - 通过 ssh 在客户端机器中打开浏览器
- java - 使用 SELECT 时的 JPA 奇怪行为
- node.js - Puppeteer - 点击文本后面的标签
- haskell - 为包含不能具有 Eq 或 Show 的字段的 ADT 派生 Eq 和 Show
- python - 我如何在 pycharm 中查看完整的 pandas.dataframe 列而不是“...”?
- javascript - 无法理解 DOM API
- python - 我可以在 print() 函数或常规 if-else 语句中定义一个函数,而不是在 Python 中使用三元运算符吗?