如何仅更改字典键?没有变化的价值迅速

时间:2019-05-30 10:33:39

标签: ios arrays swift sorting dictionary

我有这样的数组。

var Array = [Int:[String:Any]]()

我只是更新值

 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: ["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"], 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]]
  

但是我想将键更新为[0] [1]而不是[0] [2]

有人可以帮我吗?

2 个答案:

答案 0 :(得分:3)

您为什么要尝试使用字典模仿数组?

如果您有一个像这样的数组。

var array: [[String: Any]] = [["year": "2019"], ["year": "2020"], ["year": "2021"]] // Minimalistic example array

您可以删除该特定位置的值,它会为您提供当前所需的内容。

array.remove(at: 1)
print(array[1])
  

[“ year”:“ 2021”]


注意-您的数据看起来像JSON响应。因此,您可以在评论中使用@Kamran的建议,并使用符合Trip的结构Decodable并直接以Trip数组的形式获取数据。但是,如果您的JSON格式为键0、1、2 ...,那么您的JSON确实很糟糕,如果可以的话,应该对其进行更改。如果不能,则必须将字典的字典更改为字典数组或更好的结构数组。

答案 1 :(得分:1)

我不太清楚这里的用例,所以我正在尝试涵盖所有可能的情况。


在数组上使用enumerated()

如果只需要添加索引,请在数组上调用enumerated()方法,例如

var array: [[String: Any]] = [["year": "2019", "tripName": "Trip#1"], ["year": "2020", "tripName": "Trip#2"], ["year": "2021", "tripName": "Trip#3"]]

array.enumerated().forEach { (arg0) in
    let (offset, element) = arg0
    debugPrint("\(offset) : \(element)")
}

会为每个元素分配一个 offset ,您可以打印或使用其他元素,在我的示例中,控制台上的输出如下所示:

0 : ["tripName": "Trip#1", "year": "2019"]
1 : ["tripName": "Trip#2", "year": "2020"]
2 : ["tripName": "Trip#3", "year": "2021"]

如果您需要实际删除某项,例如

array.remove(at: 1)

并再次调用相同的代码段(如上所述),它会分配 offset ,如下所示:

0 : ["tripName": "Trip#1", "year": "2019"]
1 : ["tripName": "Trip#3", "year": "2021"]

与您要寻找的非常相似。


从字典映射数组

如果您需要先将字典实际映射到一个数组中(例如,在对JSON响应进行后处理期间),则可以这样做,例如:

var dictionary: [Int: [String: Any]] = [0: ["year": "2019", "tripName": "Trip#1"], 1: ["year": "2020", "tripName": "Trip#2"], 2: ["year": "2021", "tripName": "Trip#3"]]

var array = dictionary.map { $0.value }

然后您就可以开始使用enumerated()方法了,就像我上面向您展示的那样。


注意::显然,如果像我一样进行映射,则会丢失原始密钥所拥有的信息,并且在我的示例中,该密钥将被替换为相同的数字,这可能会引起误解,但是如果您意识到offsetkey是两个完全不同的值,那么在进行映射后,您可能不会感到惊讶。