Swift中如何将[Any]类型数据转换为自定义Details结构体格式
Swift 中[Any]类型原始数据转
Details结构体的实现方案 核心实现思路
因为[Any]类型没有明确的元素类型,转换全程需要做安全的类型校验,避免强制解包引发运行时崩溃,整体流程为:
- 遍历
[Any]数组的每一个元素,先校验元素能否转为[String: Any]格式的字典结构,校验不通过的元素直接跳过 - 从字典中逐字段取出对应的值,和目标结构体的属性做类型匹配
- 特殊处理
UIImage类型的字段:接口/序列化返回的原始数据不可能直接包含UIImage对象,需要根据原始数据的实际格式(图片二进制Data、本地图片资源名、本地文件路径)做对应转换
示例实现代码
import UIKit // 目标结构体定义 struct Details { var image: UIImage? var title: String? var subTitle: String? } /// 将原始[Any]数组转换为Details数组 /// - Parameter rawArray: 接口/序列化拿到的[Any]类型原始数据 /// - Returns: 转换完成的Details结构体数组 func convertRawData(_ rawArray: [Any]) -> [Details] { rawArray.compactMap { item in // 安全校验元素为字典类型 guard let itemDict = item as? [String: Any] else { return nil } // 映射文本字段,兼容常见的键名大小写差异 let title = itemDict["title"] as? String let subTitle = itemDict["subTitle"] as? String ?? itemDict["subtitle"] as? String // 转换图片字段,根据原始数据格式做兼容处理 var convertedImage: UIImage? if let imageData = itemDict["image"] as? Data { convertedImage = UIImage(data: imageData) } if let imageResourceName = itemDict["image"] as? String { convertedImage = UIImage(named: imageResourceName) } // 组装结构体实例返回 return Details(image: convertedImage, title: title, subTitle: subTitle) } }
注意事项
- 全程使用
compactMap和可选绑定做安全转换,不要直接用as!做强制类型转换 - 如果原始字典的字段键名和结构体属性名不一致,调整代码中取字典值的键名即可
- 如果原始数据中image字段存的是远程图片URL,需要额外通过网络加载图片后再赋值给对应属性,无法直接从字符串转换得到UIImage实例
内容的提问来源于stack exchange,提问作者sai kumar
相关产品推荐
相关产品推荐

