Aggiungi un elemento a un array in Swift


340

Supponiamo che io abbia un array, ad esempio:

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

E più tardi voglio spingere / aggiungere un elemento alla fine di detto array, per ottenere:

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

Quale metodo dovrei usare?

E che dire del caso in cui voglio aggiungere un elemento nella parte anteriore dell'array? C'è un costante spostamento del tempo?


95
Steve Jobs, Bill Gates, Linus Torvalds, ma chi è Bret? - Sento che dovrei saperlo (e probabilmente mi
prenderò


19
Bret Victor ha ragione. Si dice che il suo lavoro sia stato d'ispirazione per parti del rapido
Fela Winkelmolen,

3
a mente, non puoi mai usare il pedice per aggiungere un elemento in un nuovo indice. la sottoscrizione viene utilizzata solo per l'aggiornamento di un valore o la lettura da un indice esistente . Quindi, se hai, let array = [Int]()non puoi mai dire array[0] = 42che darà un indice di errore fuori intervallo . Si dovrebbe usare array.append(42). Perché non riesci a iscriverti? Per lo stesso motivo non si può fare letters[3] = dper let letters = [a,b,c]. Il 3o indice è inesistente come lo è l'array [0] prima di un valore!
Miele,

4
Non insegnargli come farlo. Tim non dovrebbe essere autorizzato in questo array, è un insulto agli altri ....
Otziii

Risposte:


604

A partire da Swift 3/4/5 , questo viene fatto come segue.

Per aggiungere un nuovo elemento alla fine di una matrice.

anArray.append("This String")

Per aggiungere un array diverso alla fine dell'array.

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

Per inserire un nuovo elemento nell'array.

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

Per inserire il contenuto di una matrice diversa nella matrice.

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

Ulteriori informazioni sono disponibili nel capitolo "Tipi di raccolta" di " Il linguaggio di programmazione Swift ", a partire da pagina 110.


2
Bella risposta. L'incoerenza nel modo in cui Apple ha implementato questo è in qualche modo irritante. Presumibilmente, anArray + = "Foo" fa la stessa cosa di anArray + = ["Foo"] Personalmente, userò solo quest'ultima sintassi per evitare di confondermi.
originale

11
anArray + = "Foo" non funziona più da xCode 6 beta 5
Amitay

Puoi fare un elenco dei metodi e delle funzioni per creare e riempire anche un array ?? : D

1
Non funziona in fase di esecuzione. Ci sono già elementi nell'array che sto tentando di inserire, quindi non è così. La mia soluzione è creare un nuovo array con l'elemento che sto tentando di inserire e quindi aggiungere tutti gli elementi dell'array originale. Abbastanza sicuro che questo sia il risultato di un problema di conservazione altrove - in qualche modo questi oggetti vanno bene purché siano lasciati nei loro punti dell'array originali, ma se iOS tenta di spostarli (come risultato dell'inserto) c'è un arresto anomalo. Altrimenti si tratta di uno strano problema Swift / IB.
MusiGenesis,

1
splicerinomina insertContentsOfin Swift 2.
Almas Sapargali

21

Puoi anche passare una variabile e / o un oggetto se lo desideri.

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)

Per aggiungerli in primo piano:

//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)

Come altri hanno già affermato, non è più possibile utilizzare '+ =' da xCode 6.1


2
Ha senso, con la mancanza di una .prepend()funzione, l'inserimento in testa sembra essere un buon approccio
Atticus

1
È molto chiaro che puoi ancora usare + = ma non per un singolo elemento.
Leo Dabus,

17

Per aggiungere fino alla fine, utilizzare l' +=operatore:

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

Tale operatore è generalmente equivalente al append(contentsOf:)metodo. (E nelle versioni Swift molto vecchie, potrebbe aggiungere singoli elementi, non solo altre raccolte dello stesso tipo di elemento.)

C'è anche insert(_:at:)per l'inserimento in qualsiasi indice.

Se, per esempio, desideri una funzione di convenienza da inserire all'inizio, puoi aggiungerla alla Arrayclasse con un'estensione .


Se myArrayè di tipo Array, la prima riga non è corretta. L' +=operatore può essere utilizzato solo se entrambi myArraye l'operando giusto sono di tipo Array.
Bart Jacobs,

1
Era corretto quando ho pubblicato questa risposta, ma da allora la lingua è cambiata. Risposta aggiornata
rickster,

Dire che +=e appendsono equivalenti non è corretto, il primo prevede la creazione di un array temporaneo che verrà scartato non appena la funzione operatore lo consumerà.
Cristik,

10

Usa gli operatori + = e +:

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
}

quindi utilizzare:

var list = [AnyObject]()
list += "hello" 
list += ["hello", "world!"]
var list2 = list + "anything"

Nella seconda funzione, non è necessario eseguire l'iterazione sull'array sinistro. Fare var copy = lefte poi aggiungere copy.append(right)è sufficiente. In Swift, le matrici sono tipi di valore, non tipi di riferimento.
Natan R.,

4

Ecco una piccola estensione se si desidera inserire all'inizio dell'array senza perdere l'elemento nella prima posizione

extension Array{
    mutating func appendAtBeginning(newItem : Element){
        let copy = self
        self = []
        self.append(newItem)
        self.appendContentsOf(copy)
    }
}

Errore: il valore del tipo 'Array <Element>' non ha membri 'appendContentsOf'
Dani Kemper,

3

In Swift 4.1 e Xcode 9.4.1

Possiamo aggiungere oggetti all'array sostanzialmente in due modi

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)

Se si desidera aggiungere due matrici

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)

2

Da pagina 143 di The Swift Programming Language:

È possibile aggiungere un nuovo elemento alla fine di un array chiamando il metodo append dell'array

In alternativa, aggiungi un nuovo elemento alla fine di un array con l'operatore di assegnazione addizione (+ =)

Estratto da: Apple Inc. "The Swift Programming Language". iBook. https://itun.es/us/jEUH0.l


2

Per aggiungere alle soluzioni che suggerisconoappend , è utile sapere che si tratta di un'operazione a tempo costante ammortizzata in molti casi:

Complessità: ammortizzato O (1) a meno che l'archiviazione di sé non sia condivisa con un altro array live; O (conta) se self non avvolge un NSArray con bridge; altrimenti l'efficienza non è specificata.

Sto cercando un consoperatore simile per Swift. Dovrebbe restituire un nuovo array immutabile con l'elemento incollato all'estremità, in tempo costante, senza cambiare l'array originale. Non ho ancora trovato una funzione standard che faccia questo. Cercherò di ricordare di riferire se ne trovo uno!



1

Se si desidera aggiungere un oggetto unico, è possibile espandere la struttura dell'array

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

1

Se l'array è NSArray è possibile utilizzare la addingfunzione per aggiungere qualsiasi oggetto alla fine dell'array, in questo modo:

Rapido 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)

Risultato :

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

Questo è un modo molto semplice, saluti!


1

In Swift 4.2: è possibile utilizzare

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

o

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

0

Esempio: studenti = ["Ben", "Ivy", "Jordell"]

1) Per aggiungere singoli elementi alla fine di un array, utilizzare l'appendice (_ :)

students.append(\ "Maxime" )

2) Aggiungi più elementi contemporaneamente passando un altro array o una sequenza di qualsiasi tipo all'appendice (contentsOf :)

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

3) Per aggiungere nuovi elementi nel mezzo di un array usando il metodo insert (_: at :) per singoli elementi

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

4) Utilizzo di insert (contentsOf: at :) per inserire più elementi da un'altra raccolta o array letterale

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.