Estoy tratando de eliminar todos los elementos de la matriz con un bucle for como este:
for index 1...myArray.count {
myArray.removeAtIndex(index)
}
Pero no funciona, obtengo este error antes de construir:
Esperado ';' en la declaración 'for'
Respuestas:
Hay un método (en realidad una función)
fuente
struct
sy las estructuras tienenfunctions
clases diferentes a las que tienenmethods
.Array
s sonstruct
s.removeAll()
. Sin embargo, es una buena práctica (disciplina de memoria) eliminar todos los datos innecesarios cuando desaparece una vista.Dando por sentado que la respuesta de @ vadian es la solución , solo me gustaría señalar que su código no funciona.
En primer lugar, los índices de matriz están basados en 0, por lo que debe reescribir el rango en consecuencia:
Sin embargo, esta implementación provocará un bloqueo. Si tiene una matriz de 10 elementos, el último elemento ocupa la posición en el índice 9.
Usando ese ciclo, en la primera iteración se elimina el elemento en el índice 0, y eso hace que el último elemento se desplace hacia abajo en el índice 8.
En la siguiente iteración, el elemento del índice 1 se elimina y el último elemento se desplaza hacia abajo en el índice 7. Y así sucesivamente.
En algún punto del ciclo, un intento de eliminar un elemento de un índice no existente hará que la aplicación se bloquee.
Al eliminar elementos de una matriz en un bucle, la mejor forma de hacerlo es atravesarlo en orden inverso:
Eso garantiza que los elementos eliminados no cambien el orden o el índice de los elementos que aún deben procesarse.
fuente
public extension Array where Element : Equatable { public mutating func remove(element: Element) -> Int { var occurrences = 0; for index in (0 ..< count).reverse() { if self[index] == element { removeAtIndex(index); occurrences += 1 } }; return occurrences } }
Preferiblemente no uso toda una línea, pero ese código debe compilarse en una líneafor _ in 0...<myArray.count { myArray.removeAtIndex(0) }
? Todavía no sé mucho sobre eficiencia, pero de esta manera no es necesario invertir el rango, por lo que tal vez sea más rápido.Falta la
in
palabra clave que está causando el error. El código debe ser:Sin embargo, esto no funcionará como cabría esperar por un par de razones:
count - 1
que requeriría1..<myArray.count
Si está tratando de eliminar todas las cosas de la matriz, debe hacer lo que otros han sugerido y usar:
En el caso de que solo desee el primer elemento y nada más, puede obtener una referencia al primer objeto, vacíe la matriz y luego vuelva a agregar el objeto:
fuente
count - 1
).Si realmente desea borrar la matriz, la forma más sencilla es reinicializarla.
fuente
Su código debería funcionar, simplemente está fuera de límites.
Swift 3
Al hacer esto, reasigna una matriz vacía a la matriz existente y se hace referencia al tipo de datos.
Alternativamente, puede usar lo
removeAll
que elimina todos los elementos de la matriz y proporciona una opción para mantener la capacidad existente.Esta es una
mutating
función que significa que la matriz que llama al método será cambiada (vacía).fuente
Kyle está en el camino correcto, pero su código fallará ya que los índices posibles se reducen durante la enumeración, lo que genera índices ilegales.
Una forma de resolverlo es enumerar al revés. Con rapidez, esto se hace usando zancadas .
otra opción sería usar
filter()
Swift 1.2
Swift 2
fuente
stride
Hay un método removeAllObjects () disponible en Swift 2
Para eliminar un elemento en un índice particular, use:
Para eliminar el uso del último elemento:
Para eliminar elementos en un rango particular, use:
Para eliminar el uso de un elemento en particular:
La siguiente captura de pantalla muestra la lista de métodos disponibles en la extensión NSMutableArray
fuente
También puedes hacer esto:
fuente
Para eliminar todos los datos de una matriz
yourArrayData.removeAll()
fuente
Vadian tiene la respuesta correcta en términos de lo que está tratando de lograr. El problema que se muestra como resultado de su ejemplo de código se debe a la forma en que está intentando crear el
for
bucle.Index
comenzará en 0 por defecto. Agregar un rango de números después no es la forma correcta de crear un bucle for. Por eso ves el error. En su lugar, cree su bucle for de la siguiente manera:Con suerte, esta respuesta ayudará a otros que son nuevos en Swift o en programación.
fuente
Para eliminar todos los elementos de la matriz
fuente