Ajouter un élément à un tableau dans Swift

340

Supposons que j'ai un tableau, par exemple:

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

Et plus tard, je veux pousser / ajouter un élément à la fin dudit tableau, pour obtenir:

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

Quelle méthode dois-je utiliser?

Et qu'en est-il du cas où je veux ajouter un élément à l' avant du tableau? Y a-t-il un décalage constant dans le temps?

Fela Winkelmolen
la source
95
Steve Jobs, Bill Gates, Linus Torvalds, mais qui est Bret? - Je sens que je devrais savoir (et je vais probablement me donner un coup de pied quand je le découvrirai!)
Jimmery
23
Bret Victor? soucidream.com
onekiloparsec
19
Bret Victor a raison. Son travail aurait été une source d'inspiration pour des parties de swift
Fela Winkelmolen
3
à l'esprit, vous ne pouvez jamais utiliser l' indice pour ajouter un élément dans un nouvel index. l'indice n'est utilisé que pour mettre à jour une valeur ou lire à partir d'un index existant . Donc, si vous en avez, let array = [Int]()vous ne pouvez jamais dire que array[0] = 42cela donnera une erreur d' index hors plage . Vous devez utiliser array.append(42). Pourquoi ne pouvez-vous pas vous inscrire? Pour la même raison que vous ne pouvez pas le faire letters[3] = dpour let letters = [a,b,c]. Le 3e index est inexistant, tout comme le tableau [0] avant une valeur!
Honey
4
Ne lui apprenez pas comment faire ça. Tim ne devrait pas être autorisé dans ce tableau, c'est une insulte aux autres ....
Otziii

Réponses:

604

Depuis Swift 3/4/5 , cela se fait comme suit.

Pour ajouter un nouvel élément à la fin d'un tableau.

anArray.append("This String")

Pour ajouter un tableau différent à la fin de votre tableau.

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

Pour insérer un nouvel élément dans votre tableau.

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

Pour insérer le contenu d'un tableau différent dans votre tableau.

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

Pour plus d'informations, reportez-vous au chapitre "Types de collections" du " Langage de programmation Swift ", à partir de la page 110.

Mick MacCallum
la source
2
Très bonne réponse. L'incohérence dans la façon dont Apple a implémenté cela est un peu irritante. Vraisemblablement, anArray + = "Foo" fait la même chose que anArray + = ["Foo"] Personnellement, je n'utiliserai que cette dernière syntaxe pour éviter de m'embrouiller.
original_username
11
anArray + = "Foo" ne fonctionne plus depuis xCode 6 beta 5
Amitay
Pouvez-vous faire une liste des méthodes et des fonctions pour créer et remplir un tableau aussi ?? : D
1
Il échoue au moment de l'exécution. Il y a déjà des éléments dans le tableau que j'essaie d'insérer, donc ce n'est pas ça. Ma solution consiste à créer un nouveau tableau avec l'élément que j'essaie d'insérer, puis à ajouter tous les éléments du tableau d'origine. Je suis presque sûr que c'est le résultat d'un problème de conservation ailleurs - en quelque sorte, ces objets sont bien tant qu'ils sont laissés dans leurs emplacements d'origine, mais si iOS tente de les déplacer (à la suite de l'insertion), il y a un crash. Ou bien c'est un problème bizarre Swift / IB.
MusiGenesis
1
splicerenommer insertContentsOfdans Swift 2.
Almas Sapargali
21

Vous pouvez également passer une variable et / ou un objet si vous le souhaitez.

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)

Pour les ajouter au recto:

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

Comme d'autres l'ont déjà dit, vous ne pouvez plus utiliser '+ =' à partir de xCode 6.1

steveq88
la source
2
Cela a du sens, avec l'absence de .prepend()fonction, l'insertion en tête semble être une bonne approche
Atticus
1
Il est très clair que vous pouvez toujours utiliser + = mais pas pour un seul élément.
Leo Dabus
17

Pour ajouter à la fin, utilisez l' +=opérateur:

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

Cet opérateur est généralement équivalent à la append(contentsOf:)méthode. (Et dans les versions Swift vraiment anciennes, il pouvait ajouter des éléments uniques, pas seulement d'autres collections du même type d'élément.)

Il y a aussi insert(_:at:)pour insérer à n'importe quel index.

Si, par exemple, vous souhaitez une fonction de commodité à insérer au début, vous pouvez l'ajouter à la Arrayclasse avec une extension .

rickster
la source
Si myArrayest de type Array, la première ligne est incorrecte. L' +=opérateur ne peut être utilisé que si les deux myArrayet l'opérande de droite sont de type Array.
Bart Jacobs
1
C'était correct quand j'ai posté cette réponse, mais la langue a changé depuis. Réponse mise à jour.
rickster
Dire que +=et appendsont équivalents n'est pas correct, le premier implique la création d'un tableau temporaire qui sera rejeté dès que la fonction d'opérateur le consommera.
Cristik
10

Utilisez les opérateurs + = et +:

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
}

puis utilisez:

var list = [AnyObject]()
list += "hello" 
list += ["hello", "world!"]
var list2 = list + "anything"
Aqib Mumtaz
la source
Dans la deuxième fonction, il n'est pas nécessaire d'itérer sur le tableau de gauche. Il suffit de faire var copy = leftpuis d'ajouter copy.append(right). Dans Swift, les tableaux sont des types de valeur, pas des types de référence.
Natan R.
4

Voici une petite extension si vous souhaitez insérer au début du tableau sans perdre l'élément à la première position

extension Array{
    mutating func appendAtBeginning(newItem : Element){
        let copy = self
        self = []
        self.append(newItem)
        self.appendContentsOf(copy)
    }
}
Sebastian Ustinelli
la source
Erreur: la valeur de type 'Array <Element>' n'a pas de membre 'appendContentsOf'
Dani Kemper
3

Dans Swift 4.1 et Xcode 9.4.1

Nous pouvons ajouter des objets à Array essentiellement de deux manières

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

Type 1)

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

Type 2)

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

Si vous souhaitez ajouter deux tableaux

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
la source
2

À partir de la page 143 du langage de programmation Swift:

Vous pouvez ajouter un nouvel élément à la fin d'un tableau en appelant la méthode append du tableau

Vous pouvez également ajouter un nouvel élément à la fin d'un tableau avec l'opérateur d'affectation d'addition (+ =)

Extrait de: Apple Inc. «The Swift Programming Language». iBooks. https://itun.es/us/jEUH0.l

aglasser
la source
2

Pour compléter les solutions proposéesappend , il est utile de savoir qu'il s'agit dans de nombreux cas d'une opération à temps constant amorti :

Complexité: O amorti (1) à moins que le stockage de soi ne soit partagé avec une autre baie active; O (count) si self n'emballe pas un NSArray ponté; sinon l'efficacité n'est pas spécifiée.

Je cherche un consopérateur similaire pour Swift. Il doit renvoyer un nouveau tableau immuable avec l'élément cloué sur la fin, en temps constant, sans changer le tableau d'origine. Je n'ai pas encore trouvé de fonction standard pour cela. J'essaierai de me souvenir d'en faire rapport si j'en trouve un!

Benjohn
la source
1

Vous pourriez utiliser

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

Si vous souhaitez ajouter un objet unique, vous pouvez développer la structure du tableau

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

Si le tableau est NSArray, vous pouvez utiliser la addingfonction pour ajouter un objet à la fin du tableau, comme ceci:

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)

Résultat :

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

C'est un moyen très simple, salut!

Radames E. Hernandez
la source
1

Dans Swift 4.2: vous pouvez utiliser

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

ou

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

Exemple: étudiants = ["Ben", "Ivy", "Jordell"]

1) Pour ajouter des éléments uniques à la fin d'un tableau, utilisez l'append (_ :)

students.append(\ "Maxime" )

2) Ajoutez plusieurs éléments en même temps en passant un autre tableau ou une séquence de tout type à la méthode append (contentsOf :)

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

3) Pour ajouter de nouveaux éléments au milieu d'un tableau en utilisant la méthode insert (_: at :) pour les éléments simples

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

4) Utilisation de insert (contentsOf: at :) pour insérer plusieurs éléments d'une autre collection ou d'un littéral de tableau

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

PatelFab
la source