#ios #arrays #tableview
#iOS #массивы #просмотр таблицы
Вопрос:
Я работаю с обработкой массива, общая работа приложения заключается в том, что пользователь может выбрать количество песен, которые должны быть добавлены в определенный список воспроизведения. Я использовал Tableview для составления списка песен, когда пользователь нажимает на добавленную ячейку tableview .отметьте галочкой, когда уже найдена галочка, я удалю .checkmark, аналогично, когда пользователь выбирает песню, я сохраняю массив для сохранения идентификатора дорожки этой конкретной песни. «SongIDArray» — это массив, используемый для сохранения. Когда пользователь отменяет выбор песни, я должен удалить конкретные песни «track id». но в массиве у него есть remove(at: index) Я не могу удалить его через индекс. пожалуйста, помогите мне
например: ** мой массив**
songIDArray = [25,45,69,78,63]
Мне нужно удалить 78
из индекса, не зная пути к индексу.
Ответ №1:
Вы можете использовать фильтр для удаления значений из массива:
let newArray = [25, 45, 69, 78, 63].filter { $0 != 78 }
Комментарии:
1. можете ли вы уточнить свой ответ, т. Е. мне нужно удалить 78, но в массиве есть только индекс для удаления, как я должен удалить это
2. @KarthickTM Вы используете его следующим образом: пусть newArray = songIDArray.filter {$ 0 != 78}
Ответ №2:
removeAll
это команда для условного удаления.
var array = [25,45,69,78,63]
array.removeAll{$0 == 78}
print(array)
//[25, 45, 69, 63]
Ответ №3:
Здесь у вас есть несколько вариантов, какой лучше всего подходит для вашего конкретного варианта использования!
Удалить с помощью фильтрации
Функция filter передает каждый элемент в массиве в предоставленный вами блок кода и удаляет все элементы, для которых вы возвращаете false
. Это полезно для выполнения простого фильтра, но если вам также нужен индекс удаленного элемента (например, для перезагрузки пути к индексу табличного представления), это не очень полезно.
songIDArray = songIDArray.filter({ id in
return id != 78
})
Удалить по индексу
Сначала получите индекс для удаления по адресу, вы можете сделать это различными способами в зависимости от типа элементов, которые у вас есть в вашем массиве. Если они соответствуют Equatable
(целые числа соответствуют), вы можете использовать
if let removalIndex = songIDArray.firstIndex(of: 78) {
songIDArray.remove(at: removalIndex)
}
Если у вас нет массива Equatable
элементов, то вы можете вместо этого использовать index(where:)
, который возвращает первый индекс, для которого вы возвращаете true из предоставленного замыкания:
if let removalIndex = songIDArray.index(where: { id in
return id == 78
}) {
songIDArray.remove(at: removalIndex)
}
Этот метод полезен, если вам также нужно сделать что-то еще с индексом, например, перезагрузить a UITableViewCell
по определенному пути индекса, чтобы отразить ваши изменения и т.д.
Удалить все
В swift 4.2 также есть removeAll(where:)
функция, которая работает аналогично filter
, но не возвращает новый массив:
songIDArray.removeAll(where: { id in
return id == 78
})
Комментарии:
1. что происходит, когда массив имеет тип NSMUTABLEARRAY()
2. Есть ли какая-то особая причина, по которой у вас есть
NSMutableArray
, а не swift-массив? Я считаю, что в любом случае оно должно быть приведено к массиву swift (хотя я этого не пробовал)!