Swift中如何按多个属性将数组分组为字典?
如何在Swift中基于多个属性对数组进行分组?
当然可以实现,核心思路是将需要作为分组依据的多个属性组合成一个符合Hashable协议的类型(因为字典的键必须是可哈希的),下面提供两种常用方案:
方案一:利用元组作为分组键
Swift中,只要元组的所有元素都遵循Hashable,整个元组就自动具备Hashable特性,刚好可以直接用作字典的分组键。
完整代码示例
首先定义Person结构体:
struct Person { let name: String let age: Int let gender: String }
准备待分组的数组:
let personArray: [Person] = [ Person(name: "Alex", age: 25, gender: "Male"), Person(name: "Sara", age: 25, gender: "Female"), Person(name: "Alex", age: 25, gender: "Male") // 新增重复分组条件的示例 ]
执行分组操作:
let groupedByAgeAndName = Dictionary(grouping: personArray, by: { ($0.name, $0.age) })
访问分组结果
你可以通过元组直接访问对应分组的数据:
// 获取所有name为Alex且age为25的Person对象 let alex25Group = groupedByAgeAndName[("Alex", 25)]
方案二:自定义哈希键结构体(语义化更强)
如果需要更清晰的语义(比如分组属性较多时),可以自定义一个遵循Hashable的结构体作为分组键:
完整代码示例
先定义分组键结构体:
struct PersonGroupKey: Hashable { let name: String let age: Int }
执行分组:
let groupedDict = Dictionary(grouping: personArray, by: { person in PersonGroupKey(name: person.name, age: person.age) })
这种方式的优势是代码可读性更高,后续维护时能一眼看出分组依据是什么。
注意点
你给出的示意代码Dictionary(grouping: array, by: { $0.name && $0.age })存在逻辑错误:&&是布尔逻辑运算符,这里需要返回的是一个可哈希的分组键,而非布尔值,所以不能这样写。
内容的提问来源于stack exchange,提问作者abh
相关产品推荐
相关产品推荐

