web-dev-qa-db-fra.com

Collections immuables/mutables à Swift

Je faisais référence au guide de programmation Swift d’Apple pour comprendre la création d’objets mutables/immuables (Tableau, Dictionnaire, Ensembles, Données) en langage Swift. Mais je ne comprenais pas comment créer des collections immuables dans Swift. 

J'aimerais voir les équivalents dans Swift pour les suivants dans Objective-C

Tableau immuable

NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];

Mutable Array

NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];

Dictionnaire immuable

NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];

Dictionnaire Mutable

NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];
76
Pranav Jaiswal

Tableaux

Créer un tableau immuable

Première manière:

let array = NSArray(array: ["First","Second","Third"])

Deuxième manière:

let array = ["First","Second","Third"]

Créer un tableau mutable

var array = ["First","Second","Third"]

Ajouter un objet à un tableau

array.append("Forth")


Dictionnaires

Créer un dictionnaire immuable

let dictionary = ["Item 1": "description", "Item 2": "description"]

Créer un dictionnaire mutable

var dictionary = ["Item 1": "description", "Item 2": "description"]

Ajouter une nouvelle paire au dictionnaire

dictionary["Item 3"] = "description"

 Plus d'informations sur les développeurs Apple

103
nicael

Swift ne remplace pas NSArray ni les autres classes de collection dans Objective-C.

Il existe des classes de tableau et de dictionnaire, mais il convient de noter qu'il s'agit de types "valeur", par rapport à NSArray et NSDictionary qui sont des types "objet".

La différence est subtile mais peut être très importante pour éviter les bogues du cas Edge.

Dans Swift, vous créez un tableau "immuable" avec:

let hello = ["a", "b", "c"]

Et un tableau "mutable" avec:

var hello = ["a", "b", "c"]

Les tableaux mutables peuvent être modifiés comme NSMutableArray:

var myArray = ["a", "b", "c"]

myArray.append("d") // ["a", "b", "c", "d"]

Cependant, vous ne pouvez pas passer un tableau mutable à une fonction:

var myArray = ["a", "b", "c"]

func addToArray(myArray: [String]) {
  myArray.append("d") // compile error
}

Mais le code ci-dessus fonctionne avec un NSMutableArray:

var myArray = ["a", "b", "c"] as NSMutableArray

func addToArray(myArray: NSMutableArray) {
  myArray.addObject("d")
}

addToArray(myArray)

myArray // ["a", "b", "c", "d"]

Vous pouvez obtenir le comportement de NSMutableArray en utilisant un paramètre de méthode inout:

var myArray = ["a", "b", "c"]

func addToArray(inout myArray: [String]) {
  myArray.append("d")
}

addToArray(&myArray)

myArray // ["a", "b", "c", "d"]

Réécrit cette réponse le 15/08/2015 pour refléter le comportement actuel de Swift.

30
Abhi Beckert

Il n'y a qu'un type Array et un Dictionary dans Swift. La mutabilité dépend de la manière dont vous la construisez:

var mutableArray = [1,2,3]
let immutableArray = [1,2,3]

c'est-à-dire que si vous créez une affectation à une variable, celle-ci est modifiable, alors que si vous créez une affectation à constante, ce n'est pas le cas.

AVERTISSEMENT: Les tableaux immuables ne sont pas entièrement immuables! Vous pouvez toujours changer leur contenu, mais pas leur longueur totale!

6
ColinE

Déclarez simplement votre (n'importe quel) objet ou variable avec 

'let' key Word -> for "constan/Immutable" array, dictionary, variable, object..etc.

et

'var' key Word -> for "Mutable" array, dictionary, variable, object..etc. 

Pour plus d'information 

“Utilisez let pour créer une constante et var pour créer une variable. La valeur d’une constante n’a pas besoin d’être connue au moment de la compilation, mais vous devez lui attribuer une valeur exactement une fois. Cela signifie que vous pouvez utiliser des constantes pour nommer une valeur que vous déterminez une fois mais que vous utilisez souvent. "

var myVariable = 42
myVariable = 50
let myConstant = 42

Lisez «Le langage de programmation Swift.»

5
iPatel

Si vous voulez utiliser Array (Swift) comme avec NSArray, vous pouvez utiliser une fonction de pont simple. Exemple:

var arr1 : Array = []

arr1.bridgeToObjectiveC().count

Cela fonctionne de la même manière pour let.

3
Moti F.

De la propre documentation d'Apple:

Mutabilité des collections

Si vous créez un tableau, un ensemble ou un dictionnaire et assignez-le à un variable, la collection créée sera modifiable. Ça signifie que vous pouvez changer (ou muter) la collection après sa création par ajouter, supprimer ou modifier des éléments de la collection. Inversement, si vous affectez un tableau, un ensemble ou un dictionnaire à une constante, celle collection est immuable, et sa taille et son contenu ne peuvent pas être modifiés.

https://developer.Apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//Apple_ref/doc/uid/TP40014097-CH8-ID105

Les autres utilisations des collections immuables/mutables dépendent de la raison pour laquelle vous voulez qu'elles soient mutables/immuables. Les collections sont de type value dans Swift, ce qui signifie que leur contenu est copié lorsqu'elles sont affectées à une autre valeur ou transmises à une autre fonction/méthode. Par conséquent, vous n'avez pas à vous soucier de savoir si une fonction de la méthode de réception peut modifier le tableau d'origine. Par conséquent, vous n'avez pas besoin de vous assurer de renvoyer une collection immuable si votre classe contient une collection mutable, par exemple.

0
Balthazar