Как изменить только ключи словаря?Без изменения значений Swift - PullRequest
0 голосов
/ 30 мая 2019

У меня есть такой массив.

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 ]

3 голосов
/ 30 мая 2019

Почему вы пытаетесь имитировать массив, используя словарь?

Если у вас есть такой массив.

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

Вы можете удалить значения в этом конкретном месте, и это даст вам то, что вам нужно в данный момент.

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

["год": "2021"]


Примечание - Ваши данные выглядят как ответы JSON. Таким образом, вы можете использовать предложение @ Kamran в комментариях и использовать структуру Trip, соответствующую Decodable, и напрямую получать ваши данные в виде массива Trip s. Однако, если ваш JSON отформатирован с ключами 0, 1, 2 ... тогда ваш JSON действительно плохой, и вы должны изменить его, если можете. Если вы не можете, вам придется изменить словарь словарей на массив словаря или, что еще лучше, массив структур.

1 голос
/ 30 мая 2019

мне не совсем понятно, какой здесь вариант использования, поэтому я пытаюсь охватить максимально возможное.


с использованием 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)")
}

, который присваивает смещение каждому элементу, который вы можете распечатать или использовать иным образом, в моем примере вывод на консоль будет выглядеть следующим образом:

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

если вам действительно нужно удалить элемент, например,

array.remove(at: 1)

и вызовите тот же фрагмент (выше) снова, он присваивает смещение следующим образом:

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(), как я показал вам выше.


ПРИМЕЧАНИЕ: очевидно, если вы выполните отображение, как я, вы потеряете информацию о том, что содержит исходный ключ, и это будет заменено совпадением с тем же номером в моем примере, который может вводить в заблуждение, но если вы знаете, что offset и key - это два совершенно разных значения, у вас может не возникнуть особого удивления после того, как вы выполните сопоставление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...