You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:55:30