¿Cómo puedo desarmar / eliminar un elemento de una matriz en el nuevo lenguaje Swift de Apple?
Aquí hay un código:
let animals = ["cats", "dogs", "chimps", "moose"]
¿Cómo podría animals[2]
eliminarse el elemento de la matriz?
La let
palabra clave es para declarar constantes que no se pueden cambiar. Si desea modificar una variable, debe usarla var
, por ejemplo:
var animals = ["cats", "dogs", "chimps", "moose"]
animals.remove(at: 2) //["cats", "dogs", "moose"]
Una alternativa no mutante que mantendrá la colección original sin cambios es usarla filter
para crear una nueva colección sin los elementos que desea eliminar, por ejemplo:
let pets = animals.filter { $0 != "chimps" }
remove
devuelve el elemento eliminado:let animal = animals.remove(at: 2)
Dado
Eliminar primer elemento
Eliminar el último elemento
Eliminar elemento en el índice
Eliminar elemento de índice desconocido
Para un solo elemento
Para elementos múltiples
Notas
filter
) y devuelven el elemento que se eliminó.dropFirst
odropLast
crear una nueva matriz.Actualizado a Swift 5.2
fuente
chimps && moose
por ejemplo? Estoy buscando algo diferente a{$0 != "chimps" && $0 != "moose"}
Las respuestas anteriores parecen suponer que conoce el índice del elemento que desea eliminar.
A menudo conoce la referencia al objeto que desea eliminar en la matriz. (Recorriste tu matriz y la encontraste, por ejemplo). En tales casos, podría ser más fácil trabajar directamente con la referencia del objeto sin tener que pasar por todas partes su índice. Por lo tanto, sugiero esta solución. Utiliza el operador de identidad
!==
, que utiliza para probar si dos referencias de objeto se refieren a la misma instancia de objeto.Por supuesto, esto no solo funciona para el
String
s.fuente
list = list.filter({ $0 != element })
array.indexOf({ $0 == obj })
list
esta eliminación, no se actualizarán las otras referencias de matriz ya que está asignando una nueva matriz alist
. Solo una implicación sutil si elimina de las matrices con este enfoque.Swift 5: Aquí hay una extensión fácil y genial para eliminar elementos en una matriz, sin filtrar:
Uso:
También funciona con otros tipos, como
Int
ya queElement
es un tipo genérico:fuente
Para Swift4:
fuente
A partir de Xcode 10+, y de acuerdo con la sesión 223 de WWDC 2018, "Abrazando Algoritmos", un buen método en el futuro será
mutating func removeAll(where predicate: (Element) throws -> Bool) rethrows
El ejemplo de Apple:
ver la documentación de Apple
Entonces, en el ejemplo del OP, eliminando animales [2], "chimpancés":
Este método puede preferirse porque se escala bien (lineal frente a cuadrático), es legible y limpio. Tenga en cuenta que solo funciona en Xcode 10+, y al momento de escribir esto está en Beta.
fuente
Poca operación se relaciona con la matriz en Swift
Crear matriz
Agregar objeto en matriz
Obtener valor del objeto de índice
Añadir objeto
Insertar objeto en el índice
Eliminar objeto
Concat Object value
fuente
Podrías hacer eso. Primero asegúrese de que
Dog
realmente exista en la matriz, luego quítelo. Agregue lafor
declaración si cree queDog
puede suceder más de una vez en su matriz.Si está seguro de que
Dog
sale de la matriz y sucedió solo una vez, simplemente haga eso:Si tienes ambos, cadenas y números
fuente
Si no conoce el índice del elemento que desea eliminar y el elemento cumple con el protocolo Equatable, puede hacer lo siguiente:
animals.removeAtIndex(animals.indexOf("dogs")!)
Vea la respuesta de protocolo equitativo: ¿Cómo hago indexOfObject o un apropiado contieneObject?
fuente
Eliminar elementos usando la matriz de índices:
Matriz de cadenas e índices
Matriz de enteros e índices
Eliminar elementos utilizando el valor del elemento de otra matriz
Matrices de enteros
Arreglos de cuerdas
fuente
Con respecto a la alternativa de @ Suragch para "Eliminar elemento de índice desconocido":
Hay una versión más poderosa de "indexOf (element)" que coincidirá en un predicado en lugar del objeto en sí. Tiene el mismo nombre pero myObjects.indexOf {$ 0.property = valueToMatch} lo invoca. Devuelve el índice del primer elemento coincidente encontrado en la matriz myObjects.
Si el elemento es un objeto / estructura, es posible que desee eliminar ese elemento en función del valor de una de sus propiedades. Por ejemplo, tiene una clase Car que tiene la propiedad car.color y desea eliminar el automóvil "rojo" de su matriz de automóviles.
Previsiblemente, puede volver a trabajar esto para eliminar "todos" los autos rojos incorporando la declaración if anterior dentro de un ciclo de repetición / while y adjuntando un bloque else para establecer una bandera para "romper" el ciclo.
fuente
Swift 5
fuente
Si tiene una matriz de objetos personalizados, puede buscar por propiedad específica como esta:
o si quieres buscar por nombre por ejemplo
fuente
Esto debería hacerlo (no probado):
Editar: y necesita que sea una
var
, no unalet
, de lo contrario es una constante inmutable.fuente
Se me ocurrió la siguiente extensión que se encarga de eliminar elementos de un
Array
, asumiendo los elementos en elArray
implementoEquatable
:Uso:
fuente
extensión para eliminar el objeto String
fuente
Uso esta extensión, casi la misma que la de Varun, pero esta (a continuación) es para todo uso:
fuente
Para eliminar elementos de una matriz, use los
remove(at:)
botonesremoveLast()
yremoveAll()
.Eliminar el valor en la posición 2
Eliminar el último valor de la matriz
Elimina a todos los miembros del conjunto.
fuente