Swift调用.sorted(by:)排序字典时返回类型不匹配报错
报错原因
Swift中[String: MyCustomStruct]属于字典(Dictionary)类型,字典是无序集合,本身不维护元素的固定顺序,也不支持直接接收排序后的结果。
你对字典调用sorted(by:)方法时,返回值类型不是字典,而是由(key: String, value: MyCustomStruct)元组组成的数组,也就是报错信息中提到的Array<(key: String, value: MyCustomStruct)>,和你定义的self.places的字典类型完全不匹配,因此触发类型错误。
注意:哪怕你手动把排序后的元组数组转回字典,后续读取字典元素时顺序依然无法得到保证,排序操作会完全失去意义。
解决方案
根据你的业务需求二选一即可:
方案1:直接使用排序返回的元组数组
如果你不需要通过键快速查询值的字典特性,直接修改self.places的属性类型即可:
- 将
self.places的类型从[String: MyCustomStruct]改为[(key: String, value: MyCustomStruct)] - 原有排序逻辑不需要修改,排序后的结果可以直接赋值,后续遍历使用时通过元素的
key、value属性就能拿到对应数据
核心代码示例:
// 属性定义修改为 var places: [(key: String, value: MyCustomStruct)] = [] // 原有赋值逻辑不需要改动 DispatchQueue.main.async { self.places = decodedArray.sorted(by: { $0.value.rating > $1.value.rating }) }
方案2:转为自定义模型数组(推荐用于UI列表场景)
如果排序是为了在列表等UI场景按顺序展示数据,更建议把字典转换为自定义结构体数组存储,既保证顺序稳定,也方便后续业务逻辑调用:
- 定义适配的列表模型
struct PlaceItem { let id: String // 存储原字典的键 let detail: MyCustomStruct // 存储原字典的值 }
- 修改接收属性的类型,解码后完成转换排序
// 属性定义修改为 var places: [PlaceItem] = [] // 解码与排序逻辑调整为 do { let decodedDict = try JSONDecoder().decode([String: MyCustomStruct].self, from: jsonData) print("DECODING PROCESS SUCCESS: \(decodedDict)") // 字典转模型数组后按rating排序 let sortedList = decodedDict.map { PlaceItem(id: $0.key, detail: $0.value) } .sorted { $0.detail.rating > $1.detail.rating } DispatchQueue.main.async { self.places = sortedList } } catch { print("DECODING PROCESS FAILED: \(error)") }
内容的提问来源于stack exchange,提问作者nickcoding2
相关产品推荐
相关产品推荐

