Dodaj element do tablicy w Swift


340

Załóżmy, że mam tablicę, na przykład:

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

A później chcę przesunąć / dołączyć element na końcu wspomnianej tablicy, aby uzyskać:

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

Jakiej metody powinienem użyć?

A co z przypadkiem, w którym chcę dodać element z przodu tablicy? Czy jest stałe przesunięcie czasu?


95
Steve Jobs, Bill Gates, Linus Torvalds, ale kim jest Bret? - Czuję, że powinienem to wiedzieć (i prawdopodobnie skopię się, kiedy się dowiem!)
Jimmery,

23
Bret Victor? worrydream.com
onekiloparsec

19
Bret Victor ma rację. Mówi się, że jego praca była inspiracją dla części szybkiego
Fela Winkelmolen,

3
miej na uwadze, że nigdy nie możesz użyć indeksu dolnego, aby dodać element do nowego indeksu. indeksowanie służy tylko do aktualizacji wartości lub odczytu z istniejącego indeksu. Więc jeśli masz let array = [Int](), nigdy nie możesz powiedzieć, że array[0] = 42spowoduje błąd indeksu poza zakresem . Powinieneś użyć array.append(42). Dlaczego nie możesz się zapisać? Z tego samego powodu nie można zrobić letters[3] = ddla let letters = [a,b,c]. Trzeci indeks nie istnieje, podobnie jak tablica [0] przed wartością!
Honey

4
Nie ucz go, jak to robić. Tim nie powinien być dozwolony w tej tablicy, jest to zniewaga dla innych ....
Otziii

Odpowiedzi:


604

Począwszy od Swift 3/4/5 , odbywa się to w następujący sposób.

Aby dodać nowy element na końcu tablicy.

anArray.append("This String")

Aby dołączyć inną tablicę na końcu tablicy.

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

Aby wstawić nowy element do tablicy.

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

Aby wstawić zawartość innej tablicy do tablicy.

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

Więcej informacji można znaleźć w rozdziale „Typy kolekcji” w „ Szybkim języku programowania ”, począwszy od strony 110.


2
Świetna odpowiedź. Niespójność w sposobie implementacji tego przez Apple jest trochę irytująca. Przypuszczalnie anArray + = "Foo" robi to samo, co anArray + = ["Foo"] Osobiście użyję tej drugiej składni, aby uniknąć pomyłek.
original_username

11
anArray + = „Foo” nie działa już z xCode 6 beta 5
Amitay

Czy możesz zrobić listę metod i funkcji, aby utworzyć i wypełnić tablicę? : D

1
Nie działa w czasie wykonywania. W tablicy są już elementy, które próbuję wstawić, więc to nie wszystko. Moim obejściem jest utworzenie nowej tablicy z elementem, który próbuję wstawić, a następnie dołączenie wszystkich elementów z oryginalnej tablicy. Jestem pewien, że jest to wynikiem problemu zachowania w innym miejscu - w jakiś sposób obiekty te są w porządku, o ile pozostają w oryginalnych miejscach tablic, ale jeśli iOS spróbuje je przenieść (w wyniku wstawienia), nastąpi awaria. Albo to jakiś dziwny problem Swift / IB.
MusiGenesis

1
splicezmień nazwę na insertContentsOfw Swift 2.
Almas Sapargali

21

Możesz także przekazać zmienną i / lub obiekt, jeśli chcesz.

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)

Aby dodać je z przodu:

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

Jak już powiedzieli inni, nie można już używać „+ =” od wersji xCode 6.1


2
Ma sens, że przy braku .prepend()funkcji wstawianie w głowę wydaje się być dobrym podejściem
Atticus

1
Jest bardzo jasne, że nadal możesz używać + =, ale nie dla pojedynczego elementu.
Leo Dabus

17

Aby dodać na końcu, użyj +=operatora:

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

Ten operator jest zasadniczo równoważny append(contentsOf:)metodzie. (A w naprawdę starych wersjach Swift można było dodawać pojedyncze elementy, a nie tylko inne kolekcje tego samego typu.)

Istnieje również insert(_:at:)do wstawiania w dowolnym indeksie.

Jeśli, powiedzmy, chcesz na początku funkcji wygody wstawiania, możesz dodać ją do Arrayklasy z rozszerzeniem .


Jeśli myArrayjest typu Array, to pierwszy wiersz jest niepoprawny. +=Operator może być używany tylko wtedy, gdy oba myArrayi prawy operand są typu Array.
Bart Jacobs

1
Kiedy opublikowałem tę odpowiedź, było to poprawne, ale od tego czasu język się zmienił. Odpowiedź zaktualizowana.
Rickster,

Mówienie, że +=i appendsą one równoważne, nie jest poprawne, to pierwsze polega na utworzeniu tymczasowej tablicy, która zostanie odrzucona, gdy tylko funkcja operatora ją wykorzysta.
Cristik

10

Użyj operatorów + = i +:

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
}

następnie użyj:

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

W drugiej funkcji nie ma potrzeby iteracji po lewej tablicy. Wystarczy zrobić, var copy = lefta następnie dołączyć copy.append(right). W Swift tablice są typami wartości, a nie typami referencyjnymi.
Natan R.

4

Oto małe rozszerzenie, jeśli chcesz wstawić na początku tablicy bez utraty elementu na pierwszej pozycji

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

Błąd: wartość typu „Array <Element>” nie ma członka „appendContentsOf”
Dani Kemper

3

W Swift 4.1 i Xcode 9.4.1

Możemy dodawać obiekty do tablicy zasadniczo na dwa sposoby

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)

Jeśli chcesz dodać dwie tablice

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

Od strony 143 Swift Programming Language:

Możesz dodać nowy element na końcu tablicy, wywołując metodę append tablicy

Alternatywnie dodaj nowy element na końcu tablicy za pomocą operatora przypisania dodania (+ =)

Fragment: Apple Inc. „Swift Programming Language”. iBooks. https://itun.es/us/jEUH0.l


2

Aby dodać do sugerujących rozwiązaniaappend , warto wiedzieć, że w wielu przypadkach jest to amortyzowana operacja o stałym czasie :

Złożoność: Amortyzowana O (1), chyba że pamięć własna jest współdzielona z inną aktywną tablicą; O (policz), jeśli jaźń nie zawija zmostkowanego NSArray; w przeciwnym razie wydajność nie jest określona.

Szukam consoperatora podobnego do Swift. Powinien zwrócić nową niezmienną tablicę z elementem przyczepionym na końcu, w stałym czasie, bez zmiany pierwotnej tablicy. Nie znalazłem jeszcze standardowej funkcji, która to robi. Spróbuję pamiętać, aby zgłosić się, jeśli go znajdę!



1

Jeśli chcesz dołączyć unikalny obiekt, możesz rozwinąć Array struct

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

1

Jeśli tablica to NSArray, możesz użyć addingfunkcji, aby dodać dowolny obiekt na końcu tablicy, w następujący sposób:

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

Wynik :

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

To bardzo prosty sposób, pozdrawiam!


1

W Swift 4.2: możesz używać

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

lub

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

0

Przykład: studenci = [„Ben”, „Ivy”, „Jordell”]

1) Aby dodać pojedyncze elementy na końcu tablicy, użyj append (_ :)

students.append(\ "Maxime" )

2) Dodaj wiele elementów jednocześnie, przekazując kolejną tablicę lub dowolną sekwencję do metody append (contentOf :)

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

3) Aby dodać nowe elementy w środku tablicy za pomocą metody insert (_: at :) dla pojedynczych elementów

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

4) Za pomocą insert (contentOf: at :) wstawić wiele elementów z innej kolekcji lub literału tablicowego

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.