Swift 如何将Dictionary单个元素存入变量及处理排序后字典
问题根因说明
- Swift 对字典调用
sorted方法后,返回的是由(key: String, value: [User])类型元素组成的数组,而非原字典类型,所以你之前的变量类型不匹配会报错。 - 你尝试定义单个元素变量时写法错误,把类型当成了值来赋值,导致编译失败。
- 赋值报错是因为你把单个
Dictionary.Element类型的值,赋值给了数组类型的变量,二者类型不匹配。
实现方案
第一步:先定义类型别名简化代码
避免每次写长串类型,先做别名声明:
// 单个元素的类型,本质是带key、value的元组 typealias UserReasItem = Dictionary<String, [User]>.Element
第二步:排序变量的正确定义与赋值
视图控制器中接收排序结果的变量定义如下:
// 排序后的结果是元素数组 var orderReas: [UserReasItem] = []
排序赋值代码(注意解包原可选字典):
if let reas = reas { // 按value的数组长度降序排序 vc.orderReas = reas.sorted { $0.value.count > $1.value.count } }
第三步:支持存单个/全部元素的变量实现
提供两种可选实现方式:
方案1:极简数组实现(推荐,适配大多数场景)
直接用数组类型存储,存单个元素时数组长度为1,存全部时存入所有元素即可:
// 定义变量,空数组代表无数据 var targetReas: [UserReasItem] = [] // 存单个元素的场景 if let firstItem = vc.orderReas.first { targetReas = [firstItem] } // 存全部元素的场景 targetReas = vc.orderReas
方案2:枚举实现(语义更明确,适合需要严格区分单/全场景的情况)
先定义枚举区分存储类型:
enum ReasStorage { case single(UserReasItem) // 存单个元素 case all([UserReasItem]) // 存全部元素 case none // 无数据 }
使用示例:
var targetReas: ReasStorage = .none // 存单个元素 if let singleItem = vc.orderReas.first { targetReas = .single(singleItem) } // 存全部元素 targetReas = .all(vc.orderReas) // 使用时按需取值 switch targetReas { case .single(let item): // 处理单个元素,item.key是字符串,item.value是[User]数组 print("当前元素key:\(item.key),对应用户数:\(item.value.count)") case .all(let items): // 处理全部元素 print("共\(items.count)条分组数据") case .none: print("无可用数据") }
补充:单个元素变量的正确定义
如果你只需要单独存一个元素,直接用以下写法即可:
// 可选类型,避免空值崩溃 var singleReas: UserReasItem? // 赋值 singleReas = vc.orderReas.first
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

