Как удалить несколько элементов из массива Swift?

Например, у меня есть массив

var array = [1, 2, 3, 4]

Я хочу удалить элемент с индексом 1, а затем с индексом 3 «пусть он будет в цикле for».

Но удаление элемента с индексом 1 переместит элемент с индексом 3 в индекс 2, что испортит второе удаление.

Какие-либо предложения ?


person Raffi    schedule 23.06.2016    source источник


Ответы (3)


Учитывая ваш массив

var numbers = [1, 2, 3, 4]

и Set индексов, которые вы хотите удалить

let indexesToRemove: Set = [1, 3]

Вы хотите удалить значения "2" и "4".

Просто пиши

numbers = numbers
    .enumerated()
    .filter { !indexesToRemove.contains($0.offset) }
    .map { $0.element }

Результат

print(numbers) // [1, 3]
person Luca Angeletti    schedule 23.06.2016
comment
есть ли шанс, что вы знаете, как использовать тот же пример в Swift 3? - person Raffi; 24.06.2016
comment
Спасибо, приятель, я пытался сделать это сам, и это не сработало, я думаю, что я что-то упустил, еще раз спасибо. - person Raffi; 24.06.2016
comment
Альтернативой соединенным в цепочку filter и map является использование одного flatMap, например. ... .enumerate().flatMap { indexesToRemove.contains($0) ? nil : $1 } (тот же синтаксис Swift 2.2/3.0). - person dfrib; 24.06.2016
comment
Спасибо за информацию, приятель (Y) @dfri - person Raffi; 24.06.2016
comment
@dfri: я все время забываю, что flatMap — это новые filter + map :D - person Luca Angeletti; 24.06.2016
comment
@appzYourLife Я не знаю, какой из них я предпочитаю на самом деле; filter+map, возможно, лучше показывает намерение, тогда как flatMap может быть немного аккуратнее (имхо) в тех случаях, когда операция на карте несколько тривиальна :) полезно знать обе альтернативы! - person dfrib; 24.06.2016
comment
Что здесь дает «смещение»? - person therealManUtdFan; 28.10.2020

Это просто. удалить элементы с конца.

Сначала удалите 3, а затем удалите 1

person Seifolahi    schedule 23.06.2016
comment
Я не могу этого сделать при удалении нескольких элементов из UITableView, он выбрасывает индекс за пределы - person Raffi; 24.06.2016
comment
@Raffi, когда вы меняете источник данных (массив), вы также reloadData в таблице? Таблица должна знать, что количество строк теперь другое. - person MirekE; 24.06.2016
comment
Сначала отсортируйте массив индексов в порядке убывания. индексы = индексы. отсортировано (по: {$1 ‹ $0}) - person dev; 04.05.2019

Swift 3. Используйте быстрое закрытие для выполнения той же операции.

Если ваш массив похож на

var numbers = [0, 1, 2, 3, 4, 5]

и индексы, которые вы хотите удалить

let indexesToBeRemoved: Set = [2, 4]

numbers = numbers
    .enumerated()
    .filter { !indexesToRemove.contains($0.offset) }
    .map { $0.element }
and result

печать (числа) // [0, 1, 3, 5]

Swift 3: та же операция с объектом JSON (словарь)

var arrayString = [
    [ "char" : "Z" ],
    [ "char" : "Y" ],
    [ "char" : "X" ],
    [ "char" : "W" ],
    [ "char" : "V" ],
    [ "char" : "U" ],
    [ "char" : "T" ],
    [ "char" : "S" ]
]

let arrayIndex = [2, 3, 5]

arrayString = arrayString.enumerated()
    .filter { !arrayIndex.contains($0.0 + 1) }
    .map { $0.1 }

print(arrayString)

[["char": "Z"], ["char": "W"], ["char": "U"], ["name": "T"], ["name": "S"] ]

person Krunal    schedule 18.03.2017