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
相关产品推荐
相关产品推荐

