Удалить определенное значение из массива вместо удаления с помощью индексного пути

#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 (хотя я этого не пробовал)!