2017-08-09 6 views
2

Je n'ai aucun problème, je voudrais juste quelques précisions sur un problème concernant la mutabilité. En Objective-C nous utiliserons par exemple NSMutableArray pour obtenir un tableau mutable et un NSArray pour obtenir un tableau mutable. Je ne connais pas grand chose au fonctionnement interne des deux, mais d'après ce dont je me souviens, je crois que la différence est que NSArray ne réserve qu'une quantité de mémoire spécifique à la valeur initiale qui la rend plus efficace, alors que NSMutableArray n'a aucune idée combien de mémoire il faudra. Vraisemblablement cela signifie que NSMutableArray a des pointeurs vers des bits de mémoire qui sont partout et pas un par un comme avec NSArray? Ou peut-être réserve-t-il juste beaucoup de mémoire en espérant qu'il ne s'épuisera pas?Comment let/var résout-il la mutabilité?

Dans Swift, la substitution évidente est let pour immutable et var pour mutable. Si une variable est déclarée avec ces mots-clés, je ne vois pas de différence entre Swift et Objective-C. Cependant, je ne comprends pas comment cela fonctionne si je déclare la variable sans la variable var/let en la stockant par exemple dans une autre variable.

Disons que j'ai un dictionnaire tel que [String: [String]]. En d'autres termes, pour chaque clé de chaîne, il existe un tableau de chaînes. Considérez le cas suivant:

var dictionary: [String: [String]] = [:] 
dictionary["key"] = ["string0", "string1"] 

//dictionary now is ["key": ["string0", "string1"]] 

Mais qu'est-ce que le tableau de chaînes maintenant? Est-ce que c'est mutable parce que le dictionnaire est mutable? Est-ce mutable parce que tout ce que nous attribuons est mutable? Que diriez-vous du cas suivant:

let dictionary = ["key": ["string0", "string1"]] 
dictionary["key"].append("string2") 

Est-ce que cela fonctionnerait?

Je suppose que le problème clé est qu'en Objective-C, je définis toujours si je travaille avec NSMutableArray ou NSArray. Créer un tableau en utilisant la syntaxe littérale [@"string"] conduit toujours à un NSArray et il ne sera pas modifiable à moins que je ne le spécifie. Dans Swift, je ne sais pas quand est ce qui est mutable.

Merci

Répondre

3

Pour les tableaux et les dictionnaires, le mot-clé let ou var décide si toute la collection serait muable et immuable. En d'autres termes, si vous déclarez un dictionnaire immuable en utilisant le mot-clé let, vous ne pouvez modifier aucune de ses valeurs. Le second exemple ne fonctionnera donc pas.

En Swift décider si une collection sera mutable ou immuable ne dépend que du mot-clé que vous utilisez pour déclarer, afin de déclarer un tableau/dictionnaire en utilisant le mot-clé let sera équivalent à déclarer un tableau immuable (NSArray en Objective-C) tout en le déclarant avec le mot-clé var vous donnera un tableau mutable (NSMutableArray en Objective-C).

1

Si vous créez un tableau, un ensemble ou un dictionnaire, et l'assigner à une variable , la collection créée sera mutable. Cela signifie que vous pouvez modifier (ou modifier) ​​la collection après qu'elle a été créée par en ajoutant, en supprimant ou en modifiant des éléments de la collection. Si vous affectez un tableau, un ensemble ou un dictionnaire à une constante, cette collection est immutable et sa taille et son contenu ne peuvent pas être modifiés.

Ainsi, let constante signifie, si vous déclarez tableau ou en utilisant le dictionnaire let il sera immuable.

si vous déclarez tableau ou dictionnaire comme var il sera mutable.

Ainsi, le cas ci-dessous ne fonctionnera pas parce que le dictionnaire sera immuable:

let dictionary = ["key": ["string0", "string1"]] 
dictionary["key"].append("string2") 

Vérifiez la référence ici:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html