Swift中是否存在支持重复键的类Dictionary集合类型?
Swift中支持重复键的集合类型(用于POST请求Payload)
嘿,这个问题我太熟悉了!Swift原生的Dictionary确实不允许重复键——你写的示例代码里,后面的email值会直接覆盖前面的,最后字典里只会剩下"email": "c@xx.xxx",完全达不到你要的效果。不过别担心,有几种原生方案能完美解决这个需求,用来构造POST请求的Payload刚刚好:
方案1:用元组数组存储重复键值对
这是最直接的方式,把每个键值对存成(key: String, value: String)的元组,然后放到数组里:
var payload = [("email", "a@xx.xxx"), ("email", "b@xx.xxx"), ("email", "c@xx.xxx")]
如果你的POST请求是application/x-www-form-urlencoded格式(也就是常见的表单提交格式),可以把这个数组转成符合要求的请求体:
// 转成URLQueryItem数组 let queryItems = payload.map { URLQueryItem(name: $0.0, value: $0.1) } var components = URLComponents() components.queryItems = queryItems // 生成请求体数据 if let httpBody = components.query?.data(using: .utf8) { var request = URLRequest(url: yourTargetURL) request.httpMethod = "POST" request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.httpBody = httpBody // 发起请求... }
这样生成的请求体就是email=a@xx.xxx&email=b@xx.xxx&email=c@xx.xxx,完全符合后端对重复键参数的要求。
方案2:用字典数组适配JSON格式Payload
如果后端期望的是JSON格式的请求体(比如接受一个包含多个键值对的数组),可以用单个键值对的字典组成数组:
var payload = [ ["email": "a@xx.xxx"], ["email": "b@xx.xxx"], ["email": "c@xx.xxx"] ]
然后把这个数组序列化成JSON数据作为请求体:
do { let httpBody = try JSONSerialization.data(withJSONObject: payload) var request = URLRequest(url: yourTargetURL) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = httpBody // 发起请求... } catch { print("JSON序列化失败:\(error)") }
生成的JSON就是:
[{"email":"a@xx.xxx"},{"email":"b@xx.xxx"},{"email":"c@xx.xxx"}]
额外提示:第三方库简化操作
如果你项目里已经用了网络库比如Alamofire,它的Parameters类型天生支持重复键,直接传数组形式的参数就行:
let parameters: Parameters = [ "email": ["a@xx.xxx", "b@xx.xxx", "c@xx.xxx"] ] // 用Alamofire发起POST请求时,会自动把这个数组转成重复的键值对参数
总的来说,Swift没有原生的“支持重复键的Dictionary”,但用数组配合元组或字典的方式,完全能满足你构造POST请求Payload的需求~
内容的提问来源于stack exchange,提问作者Shan Ye
相关产品推荐
相关产品推荐

