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

Swift如何仅修改字典键(不改动值)?删除元素后重排连续整数键

问题:删除字典元素后如何让键保持连续整数序列?

我定义了一个键为整数、值为字典的集合:

var Array = [Int:[String:Any]]() // 注:这里变量名用Array容易和系统类型冲突,建议改成tripDictionary之类的名字

通过以下代码更新它的值:

let updateValue = ["Name":tripName!,"date":firstDate,"year":year,"startData":startDateValue,"endDate":endDateValue,"countryName":countrname!,"totelBudjet":totelBudjet,"backgroundImage":arrImages[randomItem],"code":getAddtripeAttibutes.code,"countryIcon":countryIcon] as [String : Any]
Array.updateValue(updateValue, forKey: tripId)
tripId = tripId + 1

初始时字典的键是[0,1,2],具体内容如下:

[0: ["year": "2019", "tripName": "Test", "backgroundImage": "Europe_Trip", "code": "DZD", "startData": 2019-05-30 10:14:11 +0000, "date": "May 30 - May 31", "endDate": 2019-05-31 10:14:11 +0000, "totelBudjet": "5000 DZD", "countryIcon": "dz", "countryName": "Algeria"], 
1: ["date": "May 30 - May 31", "backgroundImage": "Europe_Trip", "endDate": 2019-05-31 10:14:43 +0000, "code": "DZD", "countryName": "Algeria", "tripName": "Gg", "countryIcon": "dz", "totelBudjet": "500 DZD", "startData": 2019-05-30 10:14:43 +0000, "year": "2019"], 
2: ["year": "2019", "backgroundImage": "Asia_Trip", "endDate": 2019-05-31 10:15:00 +0000, "countryIcon": "al", "totelBudjet": "5800 ALL", "code": "ALL", "tripName": "Bb", "countryName": "Albania", "date": "May 30 - May 31", "startData": 2019-05-30 10:15:00 +0000]]

删除键为1的元素后,字典的键变成了[0,2],但我希望删除后键能自动变成连续的[0,1],请问该如何实现?


解决方案

首先得明确:字典本身的设计目标是存储无序、唯一的键值对,它不会自动维护键的连续性。所以要实现你想要的效果,有两种实用思路:

思路一:删除元素后手动重建连续键的字典

删除元素之后,我们可以把原字典的键值对按原键排序,然后重新分配从0开始的连续整数作为新键:

// 假设已经删除了键为1的元素
// 1. 先按原键从小到大排序,保证内容顺序和之前一致
let sortedTripEntries = Array.sorted { $0.key < $1.key }
// 2. 用enumerated()生成连续索引,重新构建字典
Array = Dictionary(uniqueKeysWithValues: sortedTripEntries.enumerated().map { ($0.offset, $0.element.value) })

执行这段代码后,你的字典键就会变成[0,1],对应原来的0和2位置的内容。

思路二:改用数组存储(更适配TableView场景)

从你的使用场景来看,你是用这些数据来更新TableView——而TableView的数据源天生就适合用数组来存储。数组的索引本身就是连续的整数,完全不需要你手动维护键的连续性,用起来更省心:

  1. 定义数组替代原字典:
var tripsArray = [[String:Any]]()
  1. 添加新旅行数据时直接append:
tripsArray.append(updateValue)
// 不需要再维护tripId变量了
  1. 删除元素时直接按索引删除:
tripsArray.remove(at: 1) // 删除索引1的元素后,后面的元素会自动前移,索引保持连续

这种方法不仅解决了键不连续的问题,还能让你和TableView的numberOfRowsInSection、cellForRowAt等方法适配得更自然,代码逻辑也更简洁。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:14:02