Fügen Sie einem Array in Swift ein Element hinzu

340

Angenommen, ich habe ein Array, zum Beispiel:

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

Und später möchte ich ein Element an das Ende des Arrays verschieben / anhängen, um Folgendes zu erhalten:

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

Welche Methode soll ich verwenden?

Und was ist mit dem Fall, in dem ich der Vorderseite des Arrays ein Element hinzufügen möchte ? Gibt es eine konstante Zeitverschiebung?

Fela Winkelmolen
quelle
95
Steve Jobs, Bill Gates, Linus Torvalds, aber wer ist Bret? - Ich habe das Gefühl, ich sollte es wissen (und ich werde mich wahrscheinlich selbst treten, wenn ich es herausfinde!)
Jimmery
23
Bret Victor? sorgendream.com
onekiloparsec
19
Bret Victor ist richtig. Seine Arbeit soll eine Inspiration für Teile von Swift gewesen sein
Fela Winkelmolen
3
Bedenken Sie jedoch, dass Sie niemals einen Index verwenden können , um einem neuen Index ein Element hinzuzufügen . Subskription wird nur zum Aktualisieren eines Werts oder zum Lesen aus einem vorhandenen Index verwendet. Wenn Sie also haben let array = [Int](), können Sie nie sagen, dass array[0] = 42es einen Indexfehler außerhalb des Bereichs gibt . Sie sollten verwenden array.append(42). Warum kannst du nicht abonnieren? Aus dem gleichen Grund Sie nicht tun können letters[3] = dfür let letters = [a,b,c]. Der 3. Index ist nicht vorhanden, ebenso wie Array [0] vor einem Wert!
Honig
4
Bringe ihm nicht bei, wie das geht. Tim sollte in diesem Array nicht erlaubt sein, es ist eine Beleidigung für die anderen ...
Otziii

Antworten:

604

Ab Swift 3/4/5 erfolgt dies wie folgt.

So fügen Sie am Ende eines Arrays ein neues Element hinzu

anArray.append("This String")

So hängen Sie ein anderes Array an das Ende Ihres Arrays an

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

So fügen Sie ein neues Element in Ihr Array ein

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

So fügen Sie den Inhalt eines anderen Arrays in Ihr Array ein

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

Weitere Informationen finden Sie im Kapitel "Sammlungstypen" von " The Swift Programming Language " ab Seite 110.

Mick MacCallum
quelle
2
Gute Antwort. Die Inkonsistenz in der Art und Weise, wie Apple dies implementiert hat, ist irritierend. Vermutlich macht anArray + = "Foo" dasselbe wie anArray + = ["Foo"] Persönlich werde ich nur die letztere Syntax verwenden, um mich nicht zu verwirren.
original_username
11
anArray + = "Foo" funktioniert nicht mehr ab xCode 6 Beta 5
Amitay
Können Sie eine Liste der Methoden und Funktionen zum Erstellen und Füllen eines Arrays erstellen? : D
1
Es schlägt zur Laufzeit fehl. Das Array enthält bereits Elemente, die ich einzufügen versuche. Das ist es also nicht. Meine Problemumgehung besteht darin, ein neues Array mit dem Element zu erstellen, das ich einfügen möchte, und dann alle Elemente aus dem ursprünglichen Array anzuhängen. Ziemlich sicher, dass dies das Ergebnis eines Beibehaltungsproblems an anderer Stelle ist - irgendwie sind diese Objekte in Ordnung, solange sie an ihren ursprünglichen Array-Stellen verbleiben, aber wenn iOS versucht, sie zu verschieben (aufgrund der Einfügung), kommt es zu einem Absturz. Oder dies ist ein seltsames Swift / IB-Problem.
MusiGenesis
1
spliceUmbenennung insertContentsOfin Swift 2.
Almas Sapargali
21

Sie können auch eine Variable und / oder ein Objekt übergeben, wenn Sie möchten.

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)

So fügen Sie sie der Vorderseite hinzu:

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

Wie bereits erwähnt, können Sie ab xCode 6.1 '+ =' nicht mehr verwenden

steveq88
quelle
2
Sinnvoll, mit dem Fehlen einer .prepend()Funktion, scheint das Einfügen am Kopf ein guter Ansatz zu sein
Atticus
1
Es ist sehr klar, dass Sie immer noch + = verwenden können, jedoch nicht für ein einzelnes Element.
Leo Dabus
17

Verwenden Sie zum Hinzufügen am Ende den +=Operator:

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

Dieser Operator entspricht im Allgemeinen der append(contentsOf:)Methode. (Und in wirklich alten Swift-Versionen könnten einzelne Elemente angehängt werden, nicht nur andere Sammlungen desselben Elementtyps.)

Es gibt auch insert(_:at:)zum Einfügen an einem beliebigen Index.

Wenn Sie beispielsweise zu Beginn eine praktische Funktion zum Einfügen wünschen, können Sie sie der ArrayKlasse mit einer Erweiterung hinzufügen .

Rickster
quelle
Wenn myArrayes sich um einen Typ handelt Array, ist die erste Zeile falsch. Der +=Operator kann nur verwendet werden, wenn beide myArrayund der richtige Operand vom Typ sind Array.
Bart Jacobs
1
Es war richtig, als ich diese Antwort gepostet habe, aber die Sprache hat sich seitdem geändert. Antwort aktualisiert.
Rickster
Zu sagen, dass +=und appendäquivalent sind, ist nicht korrekt. Ersteres beinhaltet die Erstellung eines temporären Arrays, das verworfen wird, sobald die Operatorfunktion es verbraucht.
Cristik
10

Verwenden Sie die Operatoren + = und +:

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
}

dann benutze :

var list = [AnyObject]()
list += "hello" 
list += ["hello", "world!"]
var list2 = list + "anything"
Aqib Mumtaz
quelle
In der zweiten Funktion muss das linke Array nicht durchlaufen werden. Tun var copy = leftund dann Anhängen copy.append(right)ist genug. In Swift sind Arrays Werttypen und keine Referenztypen.
Natan R.
4

Hier ist eine kleine Erweiterung, wenn Sie am Anfang des Arrays einfügen möchten, ohne das Element an der ersten Position zu verlieren

extension Array{
    mutating func appendAtBeginning(newItem : Element){
        let copy = self
        self = []
        self.append(newItem)
        self.appendContentsOf(copy)
    }
}
Sebastian Ustinelli
quelle
Fehler: Der Wert vom Typ 'Array <Element>' hat kein Mitglied 'appendContentsOf'
Dani Kemper
3

In Swift 4.1 und Xcode 9.4.1

Wir können dem Array Objekte grundsätzlich auf zwei Arten hinzufügen

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

Typ 1)

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

Typ 2)

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

Wenn Sie zwei Arrays hinzufügen möchten

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
quelle
2

Ab Seite 143 der Swift-Programmiersprache:

Sie können am Ende eines Arrays ein neues Element hinzufügen, indem Sie die Append-Methode des Arrays aufrufen

Alternativ können Sie mit dem Additionszuweisungsoperator (+ =) ein neues Element am Ende eines Arrays hinzufügen.

Auszug aus: Apple Inc. "Die schnelle Programmiersprache". iBooks. https://itun.es/us/jEUH0.l

Aglasser
quelle
2

Um die vorgeschlagenen Lösungenappend zu ergänzen , ist es nützlich zu wissen, dass dies in vielen Fällen eine amortisierte Operation mit konstanter Zeit ist:

Komplexität: Amortisiertes O (1), sofern der Speicher des Selbst nicht mit einem anderen Live-Array geteilt wird; O (count), wenn self ein überbrücktes NSArray nicht einwickelt; Andernfalls ist der Wirkungsgrad nicht spezifiziert.

Ich suche einen consähnlichen Operator für Swift. Es sollte ein neues unveränderliches Array mit dem am Ende angehefteten Element in konstanter Zeit zurückgegeben werden, ohne das ursprüngliche Array zu ändern. Ich habe noch keine Standardfunktion gefunden, die dies tut. Ich werde versuchen, mich daran zu erinnern, mich zu melden, wenn ich einen finde!

Benjohn
quelle
1

Du könntest benutzen

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

Wenn Sie ein eindeutiges Objekt anhängen möchten, können Sie die Array- Struktur erweitern

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

Wenn das Array NSArray ist, können Sie mit der addingFunktion ein beliebiges Objekt am Ende des Arrays hinzufügen, wie folgt :

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)

Ergebnis :

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

Das ist ein sehr einfacher Weg, Grüße!

Radames E. Hernandez
quelle
1

In Swift 4.2: Sie können verwenden

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

oder

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

Beispiel: Studenten = ["Ben", "Ivy", "Jordell"]

1) Um einzelne Elemente am Ende eines Arrays hinzuzufügen, verwenden Sie den Anhang (_ :)

students.append(\ "Maxime" )

2) Fügen Sie mehrere Elemente gleichzeitig hinzu, indem Sie ein anderes Array oder eine Sequenz beliebiger Art an die Methode append (contentOf :) übergeben

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

3) Hinzufügen neuer Elemente in der Mitte eines Arrays mithilfe der Methode insert (_: at :) für einzelne Elemente

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

4) Verwenden Sie insert (contentOf: at :), um mehrere Elemente aus einer anderen Sammlung oder einem anderen Array-Literal einzufügen

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

PatelFab
quelle