vacio index for arreglos array ios iphone arrays swift elements

ios - index - map swift



Eliminar elemento de matriz especĂ­fico, igual a cadena-Swift (6)

No está claro si por más rápido te refieres en términos de tiempo de ejecución o cantidad de código.

En este último caso, puede crear fácilmente una copia utilizando el método de filter . Por ejemplo, dada la siguiente matriz:

let array = ["1", "2", "3", "4", "5"]

puede crear una copia con todos los elementos pero "2" como:

let filteredArray = array.filter { $0 != "2" }

¿No hay una manera fácil de eliminar un elemento específico de una matriz, si es igual a una cadena dada? Las soluciones son encontrar el índice del elemento de la matriz que desea eliminar y luego eliminar removeAtIndex , o crear una nueva matriz donde anexe todos los elementos que no sean iguales a la cadena dada. ¿Pero no hay una manera más rápida?


Querrás usar filter() . Si tiene que eliminar un solo elemento (llamado say obj ), entonces el predicado filter() será { $0 != obj } . Si hace esto repetidamente para una matriz grande, esto podría ser un problema de rendimiento. Si puede diferir la eliminación de objetos individuales y desea eliminar una sub-matriz completa, use algo como:

var stringsToRemove : [String] = ... var strings : [String] = ... strings.filter { !contains(stringsToRemove, $0) }

por ejemplo:

1> ["a", "b", "c", "d"].filter { !contains(["b", "c"], $0) } $R5: [String] = 2 values { [0] = "a" [1] = "d" }


Usar un filtro como el sugerido anteriormente es bueno. Pero si desea eliminar solo una aparición de un valor o asume que no hay duplicados en la matriz y desea un algoritmo más rápido, use esto (en Swift3):

if let index = array.index(of: "stringToRemove") { array.remove(at: index) } else { // not found }


si necesita eliminar subArray de la matriz, esta es una solución perfecta con Swift3 :

var array = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] let subArrayToDelete = ["c", "d", "e", "ee"] array = array.filter{ !subArrayToDelete.contains($0) } print(array) // ["a", "b", "f", "g", "h", "i", "j"]

Esto es mejor para su rendimiento en lugar de eliminar uno por uno.

Por cierto, la solución más rápida es (pero reorganizará los elementos en la matriz final):

array = Array(Set(array).subtracting(subArrayToDelete))


Puede usar filter () en combinación con la sobrecarga del operador para producir una solución fácilmente repetible :

func -= (inout left: [String], right: String){ left = left.filter{$0 != right} } var myArrayOfStrings:[String] = ["Hello","Playground","World"] myArrayOfStrings -= "Hello" print(myArrayOfStrings) // "[Playground, World]"


Puede usar filter () para filtrar su matriz de la siguiente manera

var strings = ["Hello","Playground","World"] strings = strings.filter{$0 != "Hello"} print(strings) // "[Playground, World]"

editar / actualizar:

Xcode 10 • Swift 4.2 o posterior

Puede usar el nuevo método de mutación removeAll(where:) llamado removeAll(where:)

var strings = ["Hello","Playground","World"] strings.removeAll { $0 == "Hello" } print(strings) // "[Playground, World]"

Si necesita eliminar solo la primera aparición de un elemento, podemos implementar un método de eliminación personalizado en RangeReplaceableCollection restringe los elementos a Equatable:

extension RangeReplaceableCollection where Element: Equatable { @discardableResult mutating func removeFirstElementEqual(to element: Element) -> Element? { guard let index = firstIndex(of: element) else { return nil } return remove(at: index) } }

O usando un predicado para elementos no equiparables:

extension RangeReplaceableCollection { @discardableResult mutating func removeFirstElement(where predicate: @escaping ((Element) -> Bool)) -> Element? { guard let index = firstIndex(where: predicate) else { return nil } return remove(at: index) } }

var strings = ["Hello","Playground","World"] strings.removeFirstElementEqual(to: "Hello") print(strings) // "[Playground, World]" strings.removeFirstElement { $0 == "Playground" } print(strings) // "[World]"