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]"