arrays - initialize - swift array filter
Cómo reorganizar el elemento de una matriz a una nueva posición en Swift? (9)
Actualizar con Swift 4, Swipe array index
for (index,addres) in self.address.enumerated() {
if addres.defaultShipping == true{
let defaultShipping = self.address.remove(at: index)
self.address.insert(defaultShipping, at: 0)
}
}
Considere la matriz [1,2,3,4]
. ¿Cómo puedo reorganizar el elemento de la matriz a una nueva posición?
Por ejemplo:
put 3 into position 4 [1,2,4,3]
put 4 in to position 1 [4,1,2,3]
put 2 into position 3 [1,3,2,4]
.
Swift 3.0+:
let element = arr.remove(at: 3)
arr.insert(element, at: 2)
y en forma de función:
func rearrange<T>(array: Array<T>, fromIndex: Int, toIndex: Int) -> Array<T>{
var arr = array
let element = arr.remove(at: fromIndex)
arr.insert(element, at: toIndex)
return arr
}
Swift 2.0:
Esto pone 3 en posición 4.
let element = arr.removeAtIndex(3)
arr.insert(element, atIndex: 2)
Incluso puedes hacer una función general:
func rearrange<T>(array: Array<T>, fromIndex: Int, toIndex: Int) -> Array<T>{
var arr = array
let element = arr.removeAtIndex(fromIndex)
arr.insert(element, atIndex: toIndex)
return arr
}
Aquí se necesita la var
arr
, porque no se puede mutar el parámetro de entrada sin especificar que esté in-out
. Sin embargo, en nuestro caso obtenemos funciones puras sin efectos secundarios, lo cual es mucho más fácil de razonar, en mi opinión. Entonces podrías llamarlo así:
let arr = [1,2,3,4]
rearrange(arr, fromIndex: 2, toIndex: 0) //[3,1,2,4]
¡Todas las respuestas excelentes! Aquí hay una solución Swift 4 más completa con el rendimiento en mente y una bonificación para los fanáticos de referencia y GIF. ✌️
extension Array where Element: Equatable
{
mutating func move(_ element: Element, to newIndex: Index) {
if let oldIndex: Int = self.index(of: element) { self.move(from: oldIndex, to: newIndex) }
}
}
extension Array
{
mutating func move(from oldIndex: Index, to newIndex: Index) {
// Don''t work for free and use swap when indices are next to each other - this
// won''t rebuild array and will be super efficient.
if oldIndex == newIndex { return }
if abs(newIndex - oldIndex) == 1 { return self.swapAt(oldIndex, newIndex) }
self.insert(self.remove(at: oldIndex), at: newIndex)
}
}
No hay funcionalidad de movimiento en swift para matrices. puede tomar un objeto en un índice quitándolo de allí y colocarlo en su índice favorito usando ''insertar''
var swiftarray = [1,2,3,4]
let myobject = swiftarray.removeAtIndex(1) // 2 is the object at 1st index
let myindex = 3
swiftarray.insert(myobject, atIndex: myindex) // if you want to insert the object to a particular index here it is 3
swiftarray.append(myobject) // if you want to move the object to last index
Podemos usar el método de intercambio para intercambiar elementos en una matriz:
var arr = ["one", "two", "three", "four", "five"]
// Swap elements at index: 2 and 3
print(arr)
swap(&arr[2], &arr[3])
print(arr)
Sin embargo, la solución de Leo Dabus es excelente, ya que la condición previa (de! = A && indices.contains (de! = A && indices.contains (to), "índices inválidos") bloqueará la aplicación si no se cumplen las condiciones. Lo cambié para proteger y una declaración if: si por alguna razón no se cumplen las condiciones, no pasa nada y la aplicación continúa. Creo que deberíamos evitar hacer extensiones que puedan bloquear la aplicación. Si lo desea, podría hacer que la función de reorganización devuelva un Bool verdadero si es exitoso y falso si falla. La solución más segura:
extension Array {
mutating func rearrange(from: Int, to: Int) {
guard from != to else { return }
//precondition(from != to && indices.contains(from) && indices.contains(to), "invalid indexes")
if indices.contains(from) && indices.contains(to) {
insert(remove(at: from), at: to)
}
}
buen consejo de Leo.
para Swift 3:
extension Array {
mutating func rearrange(from: Int, to: Int) {
insert(remove(at: from), at: to)
}
}
var myArray = [1,2,3,4]
myArray.rearrange(from: 1, to: 2)
print(myArray)
editar / actualizar: Swift 3.x
extension RangeReplaceableCollection where Indices: Equatable {
mutating func rearrange(from: Index, to: Index) {
precondition(from != to && indices.contains(from) && indices.contains(to), "invalid indexes")
insert(remove(at: from), at: to)
}
}
var numbers = [1,2,3,4]
numbers.rearrange(from: 1, to: 2)
print(numbers) // [1, 3, 2, 4]
var arr = ["one", "two", "three", "four", "five"]
// Swap elements at index: 2 and 3
print(arr)
arr.swapAt(2, 3)
print(arr)