Agregar un elemento a una matriz en Swift

340

Supongamos que tengo una matriz, por ejemplo:

var myArray = ["Steve", "Bill", "Linus", "Bret"]

Y luego quiero empujar / agregar un elemento al final de dicha matriz, para obtener:

["Steve", "Bill", "Linus", "Bret", "Tim"]

¿Qué método debo usar?

¿Y qué pasa con el caso en el que quiero agregar un elemento al frente de la matriz? ¿Hay un tiempo constante sin cambio?

Fela Winkelmolen
fuente
95
Steve Jobs, Bill Gates, Linus Torvalds, pero ¿quién es Bret? - Siento que debería saberlo (¡y probablemente voy a
patearme
23
Bret Victor? worrydream.com
onekiloparsec
19
Bret Victor tiene razón. Se dice que su trabajo fue una inspiración para partes de
Swift
3
Tenga en cuenta que nunca puede usar el subíndice para agregar un elemento a un nuevo índice. la subscripción solo se usa para actualizar un valor o leer un índice existente . Entonces, si tiene let array = [Int](), nunca puede decir array[0] = 42que dará un error de índice fuera de rango . Debe utilizar array.append(42). ¿Por qué no puedes subíndice? Por la misma razón no se puede hacer letters[3] = dpara let letters = [a,b,c]. ¡El 3er índice no existe como lo es la matriz [0] antes de un valor!
Miel
44
No le enseñes cómo hacer esto. No debería permitirse a Tim en este conjunto, es un insulto para los demás ...
Otziii

Respuestas:

604

A partir de Swift 3/4/5 , esto se hace de la siguiente manera.

Para agregar un nuevo elemento al final de una matriz.

anArray.append("This String")

Para agregar una matriz diferente al final de su matriz.

anArray += ["Moar", "Strings"]
anArray.append(contentsOf: ["Moar", "Strings"])

Para insertar un nuevo elemento en su matriz.

anArray.insert("This String", at: 0)

Para insertar el contenido de una matriz diferente en su matriz.

anArray.insert(contentsOf: ["Moar", "Strings"], at: 0)

Se puede encontrar más información en el capítulo "Tipos de colección" de " El lenguaje de programación Swift ", que comienza en la página 110.

Mick MacCallum
fuente
2
Gran respuesta. La inconsistencia en la forma en que Apple implementó esto es un poco irritante. Presumiblemente, anArray + = "Foo" hace lo mismo que anArray + = ["Foo"] Personalmente, solo usaré la última sintaxis para evitar confundirme.
original_username
11
anArray + = "Foo" ya no funciona desde xCode 6 beta 5
Amitay
¿Puedes hacer una lista de los métodos y funciones para crear y completar una matriz también? : D
1
Está fallando en el tiempo de ejecución. Ya hay elementos en la matriz que estoy intentando insertar, así que no es eso. Mi solución es crear una nueva matriz con el elemento que estoy intentando insertar y luego agregar todos los elementos de la matriz original. Estoy bastante seguro de que esto es el resultado de un problema de retención en otro lugar: de alguna manera, estos objetos están bien siempre que se dejen en sus puntos de matriz originales, pero si iOS intenta moverlos (como resultado de la inserción) hay un bloqueo. O bien, este es un problema extraño de Swift / IB.
MusiGenesis
1
splicecambiar el nombre a insertContentsOfen Swift 2.
Almas Sapargali
21

También puede pasar una variable y / u objeto si lo desea.

var str1:String = "John"
var str2:String = "Bob"

var myArray = ["Steve", "Bill", "Linus", "Bret"]

//add to the end of the array with append
myArray.append(str1)
myArray.append(str2)

Para agregarlos al frente:

//use 'insert' instead of append
myArray.insert(str1, atIndex:0)
myArray.insert(str2, atIndex:0)

//Swift 3
myArray.insert(str1, at: 0)
myArray.insert(str2, at: 0)

Como ya han dicho otros, ya no puede usar '+ =' a partir de xCode 6.1

steveq88
fuente
2
Tiene sentido, con la falta de una .prepend()función, insertar en la cabeza parece ser un buen enfoque
Atticus
1
Está muy claro que aún puede usar + = pero no para un solo elemento.
Leo Dabus
17

Para agregar al final, use el +=operador:

myArray += ["Craig"]
myArray += ["Jony", "Eddy"]

Ese operador es generalmente equivalente al append(contentsOf:)método. (Y en versiones Swift realmente antiguas, podría agregar elementos individuales, no solo otras colecciones del mismo tipo de elemento).

También hay insert(_:at:)para insertar en cualquier índice.

Si, por ejemplo, desea una función conveniente para insertar al principio, puede agregarla a la Arrayclase con una extensión .

rickster
fuente
Si myArrayes de tipo Array, entonces la primera línea es incorrecta. El +=operador solo se puede usar si ambos myArrayy el operando correcto son de tipo Array.
Bart Jacobs
1
Fue correcto cuando publiqué esta respuesta, pero el idioma ha cambiado desde entonces. Respuesta actualizada
rickster
Decir que +=y appendson equivalentes no es correcto, lo primero implica la creación de una matriz temporal que se descartará tan pronto como la función del operador la consuma.
Cristik
10

Utilice los operadores + = y +:

extension Array {

}

func += <V> (inout left: [V], right: V) {
    left.append(right)
}

func + <V>(left: Array<V>, right: V) -> Array<V>
{
    var map = Array<V>()
    for (v) in left {
        map.append(v)
    }

    map.append(right)

    return map
}

luego use:

var list = [AnyObject]()
list += "hello" 
list += ["hello", "world!"]
var list2 = list + "anything"
Aqib Mumtaz
fuente
En la segunda función, no hay necesidad de iterar sobre la matriz izquierda. Hacer var copy = lefty luego agregar copy.append(right)es suficiente. En Swift, las matrices son tipos de valor, no tipos de referencia.
Natan R.
4

Aquí hay una pequeña extensión si desea insertar al comienzo de la matriz sin perder el elemento en la primera posición

extension Array{
    mutating func appendAtBeginning(newItem : Element){
        let copy = self
        self = []
        self.append(newItem)
        self.appendContentsOf(copy)
    }
}
Sebastian Ustinelli
fuente
Error: el valor del tipo 'Array <Element>' no tiene miembro 'appendContentsOf'
Dani Kemper el
3

En Swift 4.1 y Xcode 9.4.1

Podemos agregar objetos a Array básicamente de dos maneras

let stringOne = "One"
let strigTwo = "Two"
let stringThree = "Three"
var array:[String] = []//If your array is string type

Tipo 1)

//To append elements at the end
array.append(stringOne)
array.append(stringThree)

Tipo 2)

//To add elements at specific index
array.insert(strigTwo, at: 1)

Si quieres agregar dos matrices

var array1 = [1,2,3,4,5]
let array2 = [6,7,8,9]

let array3 = array1+array2
print(array3)
array1.append(contentsOf: array2)
print(array1)
iOS
fuente
2

De la página 143 del lenguaje de programación Swift:

Puede agregar un nuevo elemento al final de una matriz llamando al método append de la matriz

Alternativamente, agregue un nuevo elemento al final de una matriz con el operador de asignación de suma (+ =)

Extracto de: Apple Inc. "El lenguaje de programación Swift". iBooks https://itun.es/us/jEUH0.l

aglasser
fuente
2

Para agregar a las soluciones que sugierenappend , es útil saber que esta es una operación amortizada de tiempo constante en muchos casos:

Complejidad: O (1) amortizado a menos que el almacenamiento del self se comparta con otra matriz en vivo; O (contar) si self no envuelve un NSArray con puente; de lo contrario, la eficiencia no se especifica.

Estoy buscando un consoperador similar para Swift. Debería devolver una nueva matriz inmutable con el elemento agregado al final, en tiempo constante, sin cambiar la matriz original. Todavía no he encontrado una función estándar que haga esto. ¡Intentaré recordar informarme si encuentro uno!

Benjohn
fuente
1

Podrías usar

Myarray.insert("Data #\(index)", atIndex: index)
ANIL.MUNDURU
fuente
1

Si desea agregar un objeto único, puede expandir Array struct

extension Array where Element: Equatable {
    mutating func appendUniqueObject(object: Generator.Element) {
        if contains(object) == false {
            append(object)
        }
    }
}
Tikhonov Alexander
fuente
1

Si la matriz es NSArray, puede usar la addingfunción para agregar cualquier objeto al final de la matriz, de esta manera:

Swift 4.2

var myArray: NSArray = []
let firstElement: String = "First element"
let secondElement: String = "Second element"

// Process to add the elements to the array
myArray.adding(firstElement)
myArray.adding(secondElement)

Resultado :

print(myArray) 
// ["First element", "Second element"]

Esa es una manera muy simple, saludos!

Radames E. Hernandez
fuente
1

En Swift 4.2: puedes usar

myArray.append("Tim") //To add "Tim" into array

o

myArray.insert("Tim", at: 0) //Change 0 with specific location 
Ridho Octanio
fuente
0

Ejemplo: estudiantes = ["Ben", "Ivy", "Jordell"]

1) Para agregar elementos individuales al final de una matriz, use el apéndice (_ :)

students.append(\ "Maxime" )

2) Agregue varios elementos al mismo tiempo pasando otra matriz o una secuencia de cualquier tipo al método append (contentsOf :)

students.append(contentsOf: ["Shakia" , "William"])

3) Para agregar nuevos elementos en el medio de una matriz utilizando el método insert (_: at :) para elementos individuales

students.insert("Liam" , at:2 )

4) Uso de insert (contentsOf: at :) para insertar múltiples elementos de otra colección o matriz literal

students.insert(['Tim','TIM' at: 2 )

PatelFab
fuente