Swift中如何将[Any]类型数组转换为结构体数组?
将[Any]数组转换为ThreatsModel结构体数组的解决方案
你可以通过以下两种常用方式完成转换,适配不同场景需求:
方法一:手动遍历转换(直观可控)
这种方式适合字段较少的模型,能清晰处理类型校验与转换失败的情况:
struct ThreatsModel: Codable { let info: String let name: Int let threatTypeId: Int } func convertToThreatsModels(from anyArray: [Any]) -> [ThreatsModel] { var result = [ThreatsModel]() for element in anyArray { // 将Any类型元素转为[String: Any]字典 guard let threatDict = element as? [String: Any] else { continue } // 校验并提取各字段类型 guard let info = threatDict["info"] as? String, let name = threatDict["name"] as? Int, let threatTypeId = threatDict["threatTypeId"] as? Int else { continue } // 初始化模型并加入结果数组 result.append(ThreatsModel(info: info, name: name, threatTypeId: threatTypeId)) } return result } // 调用示例 let threatsModels = convertToThreatsModels(from: threatsArrayVariable)
方法二:利用Codable与JSON序列化(简洁高效)
如果模型字段较多,这种方式能借助Codable的自动解码能力,减少重复代码:
struct ThreatsModel: Codable { let info: String let name: Int let threatTypeId: Int } func convertWithCodable(from anyArray: [Any]) -> [ThreatsModel] { var result = [ThreatsModel]() let decoder = JSONDecoder() for element in anyArray { guard let threatDict = element as? [String: Any] else { continue } // 将字典转为JSON Data guard let jsonData = try? JSONSerialization.data(withJSONObject: threatDict) else { continue } // 解码为ThreatsModel实例 if let model = try? decoder.decode(ThreatsModel.self, from: jsonData) { result.append(model) } } return result } // 调用示例 let threatsModels = convertWithCodable(from: threatsArrayVariable)
注意事项
- 原数组打印出的
=符号是Objective-C风格的字典格式,在Swift中实际存储为[String: Any]类型,直接转换即可。 - 两种方法都加入了类型校验,避免因字段缺失或类型不匹配导致崩溃,你可根据需求调整错误处理逻辑(比如抛出错误而非跳过)。
内容的提问来源于stack exchange,提问作者Maulana Frasha
相关产品推荐
相关产品推荐

