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.