Swift中如何对JSON返回的buttons数组按payload升序排序并调整title格式
Swift 接口返回按钮数组的排序与字段格式化实现
基础模型定义
首先需要定义与接口JSON结构匹配的可解码模型,完成响应数据的解析:
- 外层响应模型需包含
buttons数组字段,对应接口返回的按钮集合 - 单个按钮模型需精准映射两个字段:
payload(字符串形式的数值)、title(按钮展示文本)
核心处理逻辑
整体处理分为两步,无额外第三方依赖,基于Swift原生语法即可实现:
按payload数值升序排序
注意:不可直接对字符串格式的payload做字典序排序,否则遇到多位数payload时会出现排序错乱,比如"10"会排在"2"前面
排序逻辑为:将每个按钮的payload字段转换为整数类型数值,以此为排序键对按钮数组做升序排列,最终将原本顺序为3、1、2、4的数组调整为1、2、3、4的数值顺序。
格式化按钮标题文本
遍历完成排序的按钮数组,对每个元素的title字段做格式替换:将元素对应的payload数值作为前缀,拼接成{payload值}. {原有title文本}的格式,替换原来的title内容。
示例实现代码
// 匹配接口结构的解码模型 struct ResponseModel: Decodable { let buttons: [ButtonInfo] } struct ButtonInfo: Decodable { let payload: String var title: String } // 数组处理方法 func processButtonList(from response: ResponseModel) -> [ButtonInfo] { var targetList = response.buttons // 数值排序 targetList.sort { left, right in guard let leftValue = Int(left.payload), let rightValue = Int(right.payload) else { // 非数值payload可根据业务规则兜底,默认排在数组尾部 return false } return leftValue < rightValue } // 标题格式化 for index in targetList.indices { let payloadPrefix = targetList[index].payload let originTitle = targetList[index].title targetList[index].title = "\(payloadPrefix). \(originTitle)" } return targetList }
处理效果示例
假设接口返回的原始按钮数组为:
[ {"payload": "3", "title": "退款申请"}, {"payload": "1", "title": "账户咨询"}, {"payload": "2", "title": "订单查询"}, {"payload": "4", "title": "投诉建议"} ]
经过上述逻辑处理后,最终输出的按钮数组为:
[ {"payload": "1", "title": "1. 账户咨询"}, {"payload": "2", "title": "2. 订单查询"}, {"payload": "3", "title": "3. 退款申请"}, {"payload": "4", "title": "4. 投诉建议"} ]
落地注意事项
- 由于需要修改按钮的title属性,按钮模型中的
title字段必须用var修饰,不可用不可变的let定义 - 字符串转整数的操作需要做异常判断,避免接口返回非预期的非数值型payload时造成运行时崩溃
- 排序逻辑中可根据业务需求调整非数值payload的排序位置,比如将异常值固定排在数组最前或最后
内容的提问来源于stack exchange,提问作者KosuruUday SaiKumar
相关产品推荐
相关产品推荐

