Swift中添加字典到数组及适配Codable API请求的问题
解决方案
核心问题分析
你遇到的问题本质是业务逻辑依赖的数组类型与API要求的结构不匹配:原有代码需要[String]类型的newArray,但API要求该字段是包含布尔值字典的数组[[String: Bool]](或对应结构体)。直接修改类型会破坏原有代码,因此需要针对性调整。
方案1:创建独立的API请求结构体(推荐)
这种方式完全隔离业务逻辑与API请求结构,不会影响原有代码:
- 定义符合API要求的强类型结构体(避免
[String: Any]带来的Codable隐患):
// 定义数组内的元素结构体 struct DeletedItem: Codable { let Deleted: Bool } // 定义完整的API请求结构体 struct APIRequestModel: Codable { let var1: String let var2: String let newArray: [DeletedItem] }
- 组装请求数据并编码发送:
// 从原有业务逻辑中获取数据,组装API请求 let apiRequest = APIRequestModel( var1: "1", var2: "2", newArray: [DeletedItem(Deleted: false)] ) // 编码为JSON并发送(示例) do { let jsonData = try JSONEncoder().encode(apiRequest) // 将jsonData发送至服务器 } catch { print("编码失败:\(error)") }
方案2:自定义原有RequestModel的Codable实现
如果必须复用原有RequestModel,可以通过自定义编码逻辑,让它在发送API时输出符合要求的结构,同时保持newArray的[String]类型供业务逻辑使用:
struct RequestModel: Codable { var name: String? var newArray = [String]() // 自定义编码:输出API需要的结构 func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(name, forKey: .name) // 替换为API要求的数组结构 let apiCompatibleArray = [["Deleted": false]] try container.encode(apiCompatibleArray, forKey: .newArray) } // 自定义解码:保持原有业务的[String]类型 init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) name = try container.decodeIfPresent(String.self, forKey: .name) // 解码时仍按业务需求解析为[String] newArray = try container.decode([String].self, forKey: .newArray) } enum CodingKeys: String, CodingKey { case name, newArray } }
错误原因说明
- 最初给
[String]数组追加字典报错,是因为Swift是强类型语言,数组只能存储同一类型元素,String与[String: Any]类型不兼容。 - 直接将数组改为
[Dictionary<String,Any>]! = nil会触发崩溃,因为强制解包nil会导致运行时错误,同时破坏了原有依赖[String]的代码。
内容的提问来源于stack exchange,提问作者drago
相关产品推荐
相关产品推荐

