Swift: удалить все элементы массива

Я пытаюсь удалить все элементы массива с помощью цикла for следующим образом:

for index 1...myArray.count {
   myArray.removeAtIndex(index)
}

Но это не сработает, я получаю эту ошибку перед запуском:

Ожидаемый ';' в выражении 'for'

Ответ 1

Существует метод (фактически функция)

myArray.removeAll()

Ответ 2

Принимая во внимание, что ответ @vadian - это решение, я просто хочу указать, что ваш код не работает.

Прежде всего, индексы массива основаны на 0, поэтому вы должны переписать диапазон соответственно:

for index 0..<myArray.count {
   myArray.removeAtIndex(index)
}

Однако эта реализация приведет к сбою. Если у вас есть массив из 10 элементов, последний элемент занимает позицию в индексе 9.

Используя этот цикл, на первой итерации элемент с индексом 0 удаляется, и это приводит к тому, что последний элемент сдвигается вниз по индексу 8.

На следующей итерации элемент в индексе 1 удаляется, а последний элемент сдвигается вниз по индексу 7. И так далее.

В какой-то момент цикла попытка удалить элемент для не существующего индекса приведет к сбою приложения.

При удалении элементов из массива в цикле наилучший способ сделать это - переместить его в обратном порядке:

for index in reverse(0..<myArray.count) {
    myArray.removeAtIndex(index)
}

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

Ответ 3

Если вы действительно хотите очистить массив, самый простой способ - переинициализировать его.

Ответ 4

Вам не хватает ключевого слова in, которое вызывает вашу ошибку. Код должен быть:

for index in 1...myArray.count {
    myArray.removeAtIndex(index)
}

Это, однако, не будет работать так, как вы ожидаете по нескольким причинам:

  • Последний действительный индекс count - 1, который потребует 1..<myArray.count
  • Более важно удаление элемента из массива сокращает его, тем самым каждый раз изменяя индексы.

Если вы пытаетесь удалить все вещи из массива, вы должны сделать так, как предложили и использовали другие:

myArray.removeAll()

В том случае, если вы хотите только первый элемент, и больше ничего не можете получить ссылку на первый объект, очистите массив, а затем добавьте объект обратно:

var firstElement = myArray.first!
myArray.removeAll()
myArray.append(firstElement)

Ответ 5

Ваш код должен работать, он просто не связан.

Swift 3

existingArray = []

При этом вы повторно назначаете пустой массив существующему массиву и указывается тип данных.

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

existingArray.removeAll()

Это функция mutating, которая означает, что массив, вызывающий метод, будет изменен (пуст).

Ответ 6

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

Один из способов решить это - перечислить назад. В быстрых случаях это делается с помощью шагов.

for index in stride(from: myArray.count - 1, through: 0, by: -1) {
    myArray.removeAtIndex(index)
}

другие варианты: filter()

Swift 1.2

myArray = filter(myArray, { (obj) -> Bool in
    return false
})

Swift 2

myArray = myArray.filter{ (obj) -> Bool in
    return false
}

Ответ 7

Существует метод removeAllObjects(), доступный в Swift 2

Syntax :  public func removeAllObjects()
Eg.:   mainArray.removeAllObjects

Чтобы удалить элемент при использовании определенного индекса:

Syntax : public func removeObjectAtIndex(index: Int)
Eg.: mainArray.removeObjectAtIndex(5)

Чтобы удалить последний элемент, используйте:

Syntax : public func removeLastObject()
Eg.: mainArray.removeLastObject()

Чтобы удалить элементы в определенном диапазоне, используйте:

Syntax : public func removeObject(anObject: AnyObject, inRange range: NSRange)

Чтобы удалить использование определенного элемента:

Syntax : public func removeObject(anObject: AnyObject)

Ниже снимок экрана показывает список доступных методов в расширении NSMutableArray

Снимок экрана 1

Ответ 8

Вы также можете сделать это:

for _ in myArray
{
    myArray.removeAtIndex(0)
}

Ответ 9

Вадиан имеет правильный ответ с точки зрения того, что вы пытаетесь выполнить. Проблема, указанная в результате вашего примера кода, связана с тем, как вы пытаетесь создать цикл for. Index будет начинаться с 0 по умолчанию. Добавление в диапазон значений после того, как это не правильный способ создания цикла for. Вот почему вы видите ошибку. Вместо этого создайте цикл for следующим образом:

for index in myArray.count {
    // Do stuff
}

Надеюсь, этот ответ поможет другим, которые являются новыми для Swift или программирования.