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

Swift中遍历Shifts对象数组实现地区与城市去重显示方案咨询

解决Shifts数组中地区与城市无重复展示的方案

嘿,这个需求我之前处理过好几次,给你分享两种实用的Swift实现方式,都是高效且易维护的:

方法一:字典+集合自动去重(推荐)

利用SwiftDictionary的key唯一性和Set的元素唯一性特性,能自动帮我们完成去重,代码简洁效率也高:

先补全你的Shifts结构体(方便示例):

struct Shifts: Decodable {
    let id: Int
    let region: String
    let city: String
    let nationality: String
    let idService: Int
    let shiftDate: String
    let shiftType: String
    let weekday: String
    let quantityStaff: Int
    let leadHours: Int
    let createdAt: String?
    let updatedAt: String? // 补全你未写完的字段
}

然后是核心处理代码:

// 模拟你的Shifts数据源数组
let shiftsArray: [Shifts] = [
    Shifts(id: 1, region: "华东", city: "上海", nationality: "CN", idService: 100, shiftDate: "2024-05-01", shiftType: "白班", weekday: "周三", quantityStaff: 5, leadHours: 8, createdAt: nil, updatedAt: nil),
    Shifts(id: 2, region: "华东", city: "上海", nationality: "CN", idService: 100, shiftDate: "2024-05-02", shiftType: "夜班", weekday: "周四", quantityStaff: 3, leadHours: 8, createdAt: nil, updatedAt: nil),
    Shifts(id: 3, region: "华东", city: "杭州", nationality: "CN", idService: 101, shiftDate: "2024-05-01", shiftType: "白班", weekday: "周三", quantityStaff: 4, leadHours: 8, createdAt: nil, updatedAt: nil),
    Shifts(id: 4, region: "华北", city: "北京", nationality: "CN", idService: 102, shiftDate: "2024-05-01", shiftType: "白班", weekday: "周三", quantityStaff: 6, leadHours: 8, createdAt: nil, updatedAt: nil)
]

// 定义字典:key为地区,value为该地区下的无重复城市集合
var regionCitiesMap: [String: Set<String>] = [:]

// 遍历数组填充字典
for shift in shiftsArray {
    // 若地区不存在则创建空集合,存在则直接插入城市(Set自动去重)
    regionCitiesMap[shift.region, default: []].insert(shift.city)
}

// 遍历字典展示结果
for (region, cities) in regionCitiesMap {
    print("* 地区:\(region)")
    print("  城市:\(cities.sorted())") // 转成排序后的数组更易读
}

方法二:自定义组合结构体去重(灵活扩展)

如果后续需要基于更多字段去重,或者要把地区+城市作为一个独立单元处理,可以自定义一个遵循Hashable的结构体:

// 定义地区+城市的组合结构体,实现Hashable来支持Set去重
struct RegionCityPair: Hashable {
    let region: String
    let city: String
}

var uniquePairs: Set<RegionCityPair> = []

for shift in shiftsArray {
    let pair = RegionCityPair(region: shift.region, city: shift.city)
    uniquePairs.insert(pair)
}

// 转换为排序后的数组用于展示
let sortedPairs = uniquePairs.sorted {
    $0.region < $1.region || ($0.region == $1.region && $0.city < $1.city)
}

for pair in sortedPairs {
    print("地区:\(pair.region),城市:\(pair.city)")
}

第一种方法适合快速实现基础需求,第二种方法扩展性更强,你可以根据实际业务场景选择~

内容的提问来源于stack exchange,提问作者lamatat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:30:09