Как можно удалить / удалить элемент из массива на новом языке Apple Swift?
Вот некоторый код:
let animals = ["cats", "dogs", "chimps", "moose"]
Как можно animals[2]удалить элемент из массива?
Как можно удалить / удалить элемент из массива на новом языке Apple Swift?
Вот некоторый код:
let animals = ["cats", "dogs", "chimps", "moose"]
Как можно animals[2]удалить элемент из массива?
Ответы:
letКлючевое слово для объявления констант , которые не могут быть изменены. Если вы хотите изменить переменную, вы должны использовать varвместо этого, например:
var animals = ["cats", "dogs", "chimps", "moose"]
animals.remove(at: 2) //["cats", "dogs", "moose"]
Не изменяющая альтернатива, которая сохранит исходную коллекцию без изменений, - это использовать filterдля создания новой коллекции без элементов, которые вы хотите удалить, например:
let pets = animals.filter { $0 != "chimps" }
Дано
var animals = ["cats", "dogs", "chimps", "moose"]
animals.removeFirst() // "cats"
print(animals) // ["dogs", "chimps", "moose"]
animals.removeLast() // "moose"
print(animals) // ["cats", "dogs", "chimps"]
animals.remove(at: 2) // "chimps"
print(animals) // ["cats", "dogs", "moose"]
Только для одного элемента
if let index = animals.firstIndex(of: "chimps") {
animals.remove(at: index)
}
print(animals) // ["cats", "dogs", "moose"]
Для нескольких элементов
var animals = ["cats", "dogs", "chimps", "moose", "chimps"]
animals = animals.filter(){$0 != "chimps"}
print(animals) // ["cats", "dogs", "moose"]
filter) и возвращают удаленный элемент.dropFirstили dropLastдля создания нового массива.Обновлено до Swift 5.2
Представленные выше ответы предполагают, что вы знаете индекс элемента, который хотите удалить.
Часто вы знаете ссылку на объект, который хотите удалить в массиве. (Вы перебрали свой массив и нашли его, например). В таких случаях может быть проще работать напрямую со ссылкой на объект, не пропуская при этом всюду его индекс. Следовательно, я предлагаю это решение. Он использует оператор идентификации !== , который вы используете, чтобы проверить, ссылаются ли обе ссылки на один и тот же экземпляр объекта.
func delete(element: String) {
list = list.filter() { $0 !== element }
}
Конечно, это не просто работает для Stringс.
list = list.filter({ $0 != element })
array.indexOf({ $0 == obj })
listэто удаление, они не обновят другие ссылки на массив, поскольку вы назначаете новый массив list. Просто тонкий смысл, если вы удалите из массивов с таким подходом.
Swift 5: Вот классное и простое расширение для удаления элементов в массиве без фильтрации:
extension Array where Element: Equatable {
// Remove first collection element that is equal to the given `object`:
mutating func remove(object: Element) {
guard let index = firstIndex(of: object) else {return}
remove(at: index)
}
}
Использование :
var myArray = ["cat", "barbecue", "pancake", "frog"]
let objectToRemove = "cat"
myArray.remove(object: objectToRemove) // ["barbecue", "pancake", "frog"]
Также работает с другими типами, например, так Intкак Elementэто универсальный тип:
var myArray = [4, 8, 17, 6, 2]
let objectToRemove = 17
myArray.remove(object: objectToRemove) // [4, 8, 6, 2]
Для Swift4:
list = list.filter{$0 != "your Value"}
Начиная с Xcode 10+ и в соответствии с сеансом 223 WWDC 2018 «Использование алгоритмов», хорошим способом продвижения вперед будетmutating func removeAll(where predicate: (Element) throws -> Bool) rethrows
Пример Apple:
var phrase = "The rain in Spain stays mainly in the plain."
let vowels: Set<Character> = ["a", "e", "i", "o", "u"]
phrase.removeAll(where: { vowels.contains($0) })
// phrase == "Th rn n Spn stys mnly n th pln."
Так в примере ОП, удаляя животных [2], «шимпанзе»:
var animals = ["cats", "dogs", "chimps", "moose"]
animals.removeAll(where: { $0 == "chimps" } )
// or animals.removeAll { $0 == "chimps" }
Этот метод может быть предпочтительным, потому что он хорошо масштабируется (линейный или квадратичный), удобочитаем и чист. Имейте в виду, что это работает только в Xcode 10+, и на момент написания статьи это в бета-версии.
Мало Операция относится к массиву в Swift
Создать массив
var stringArray = ["One", "Two", "Three", "Four"]
Добавить объект в массив
stringArray = stringArray + ["Five"]
Получить значение из объекта Index
let x = stringArray[1]
Добавить объект
stringArray.append("At last position")
Вставить объект в указатель
stringArray.insert("Going", atIndex: 1)
Удалить объект
stringArray.removeAtIndex(3)
Concat Object value
var string = "Concate Two object of Array \(stringArray[1]) + \(stringArray[2])"
Вы могли бы сделать это. Сначала убедитесь, что Dogдействительно существует в массиве, а затем удалите его. Добавьте forоператор, если вы считаете, что это Dogможет произойти более одного раза в вашем массиве.
var animals = ["Dog", "Cat", "Mouse", "Dog"]
let animalToRemove = "Dog"
for object in animals
{
if object == animalToRemove{
animals.removeAtIndex(animals.indexOf(animalToRemove)!)
}
}
Если вы уверены, что Dogвыходы из массива произошли только один раз, просто сделайте это:
animals.removeAtIndex(animals.indexOf(animalToRemove)!)
Если у вас есть и строки, и числа
var array = [12, 23, "Dog", 78, 23]
let numberToRemove = 23
let animalToRemove = "Dog"
for object in array
{
if object is Int
{
// this will deal with integer. You can change to Float, Bool, etc...
if object == numberToRemove
{
array.removeAtIndex(array.indexOf(numberToRemove)!)
}
}
if object is String
{
// this will deal with strings
if object == animalToRemove
{
array.removeAtIndex(array.indexOf(animalToRemove)!)
}
}
}
Если вы не знаете индекс элемента, который хотите удалить, и элемент соответствует протоколу Equatable, вы можете сделать:
animals.removeAtIndex(animals.indexOf("dogs")!)
См. Эквивалентный ответ по протоколу: Как мне сделать indexOfObject или правильно содержащийObject
Удалить элементы с помощью массива indexes:
Массив строк и индексов
let animals = ["cats", "dogs", "chimps", "moose", "squarrel", "cow"]
let indexAnimals = [0, 3, 4]
let arrayRemainingAnimals = animals
.enumerated()
.filter { !indexAnimals.contains($0.offset) }
.map { $0.element }
print(arrayRemainingAnimals)
//result - ["dogs", "chimps", "cow"]Массив целых чисел и индексов
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
let indexesToRemove = [3, 5, 8, 12]
numbers = numbers
.enumerated()
.filter { !indexesToRemove.contains($0.offset) }
.map { $0.element }
print(numbers)
//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
Удалить элементы, используя значение элемента другого массива
Массивы целых чисел
let arrayResult = numbers.filter { element in
return !indexesToRemove.contains(element)
}
print(arrayResult)
//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]Массивы строк
let arrayLetters = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
let arrayRemoveLetters = ["a", "e", "g", "h"]
let arrayRemainingLetters = arrayLetters.filter {
!arrayRemoveLetters.contains($0)
}
print(arrayRemainingLetters)
//result - ["b", "c", "d", "f", "i"]Относительно альтернативы @ Suragch "Удалить элемент неизвестного индекса":
Существует более мощная версия indexOf (element), которая будет соответствовать предикату, а не самому объекту. Он имеет то же имя, но называется myObjects.indexOf {$ 0.property = valueToMatch}. Возвращает индекс первого соответствующего элемента, найденного в массиве myObjects.
Если элемент является объектом / структурой, вы можете удалить этот элемент на основе значения одного из его свойств. Например, у вас есть класс Car с свойством car.color, и вы хотите удалить «красный» автомобиль из вашего carsArray.
if let validIndex = (carsArray.indexOf{$0.color == UIColor.redColor()}) {
carsArray.removeAtIndex(validIndex)
}
Как и ожидалось, вы могли бы переработать это, чтобы удалить «все» красные машины, добавив вышеприведенный оператор if в цикл repeat / while и прикрепив блок else, чтобы установить флаг для «выхода» из цикла.
Если у вас есть массив пользовательских объектов, вы можете искать по определенному свойству, например так:
if let index = doctorsInArea.indexOf({$0.id == doctor.id}){
doctorsInArea.removeAtIndex(index)
}
или если вы хотите искать по имени, например
if let index = doctorsInArea.indexOf({$0.name == doctor.name}){
doctorsInArea.removeAtIndex(index)
}
Это должно сделать это (не проверено):
animals[2..3] = []
Изменить: и вам нужно сделать это, а varне let, иначе это неизменяемая константа.
Я придумал следующее расширение, которое заботится об удалении элементов из Array, предполагая элементы в Arrayорудии Equatable:
extension Array where Element: Equatable {
mutating func removeEqualItems(item: Element) {
self = self.filter { (currentItem: Element) -> Bool in
return currentItem != item
}
}
mutating func removeFirstEqualItem(item: Element) {
guard var currentItem = self.first else { return }
var index = 0
while currentItem != item {
index += 1
currentItem = self[index]
}
self.removeAtIndex(index)
}
}
var test1 = [1, 2, 1, 2]
test1.removeEqualItems(2) // [1, 1]
var test2 = [1, 2, 1, 2]
test2.removeFirstEqualItem(2) // [1, 1, 2]
расширение для удаления объекта String
extension Array {
mutating func delete(element: String) {
self = self.filter() { $0 as! String != element }
}
}
Я использую это расширение, почти такое же, как у Варуна, но это (ниже) универсально:
extension Array where Element: Equatable {
mutating func delete(element: Iterator.Element) {
self = self.filter{$0 != element }
}
}
removeвозвращает удаленный элемент:let animal = animals.remove(at: 2)