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"];
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")
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"
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.
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!
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
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
.
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.
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.