let- constant
var-variable
[Constante vs variable]
[Struct vs classe]
Le doc officiel docs.swift.org dit
La valeur de a constantne peut pas être modifiée une fois définie, tandis que a variablepeut être définie sur une valeur différente à l'avenir.
Cette terminologie décrit en fait un mécanisme de réaffectation
Mutabilité - modifiable - l'état de l'objet peut être modifié après sa création

Valeur et type de référence [À propos]
Valeur (Struct, Enum)
Les Swift structpeuvent changer leur statut de mutabilité:
let+ struct= immutable= constante de valeur
Elle ne peut pas être réaffectée ou modifiée
var+ struct= mutable
Il peut être réaffecté ou modifié
Type de référence (classe)
Les Swift classessont mutableun prieuré
let+ class= constante d'adresse
Elle ne peut pas être réaffectée et peut être modifiée
var+ class
Il peut être réaffecté ou modifié
//STRUCT
//let + struct
let letStructA = StructA()
//change FAIL
letStructA.a = 5 //Compile ERROR: Cannot assign to property: 'structALet' is a 'let' constant
//reassign FAIL
letStructA = StructA() // Compile ERROR: Cannot assign to value: 'structALet' is a 'let' constant
//var + struct
var varStructA = StructA()
//change OK
varStructA.a = 5
//reassign OK
varStructA = StructA()
//CLASS
//let + class
let letClassA = ClassA()
//change OK
letClassA.a = 5
//reassign FAIL
letClassA = ClassA() // Compile ERROR: Cannot assign to value: 'classALet' is a 'let' constant
//var + class
var varClassA = ClassA()
//change OK
varClassA.a = 5
//reassign OK
varClassA = ClassA()
mutating - Fonctions de Structures Mutantes
Vous pouvez marquer la méthode d' une structure commemutating
- Indique que cette fonction modifie les valeurs des propriétés internes.
- Ne peut être utilisé que sur
var+struct
public struct StructA {
public var a = 0
public init() {}
//func foo() { //Compile ERROR: Cannot assign to property: 'self' is immutable
mutating func foo() {
a = 5
}
}
inout Modification de la structure à l'intérieur d'une fonction
Vous pouvez marquer le paramètre d'une fonction (qui est struct) comme inout
Depuis structun type de valeur, il est passé par valeur car une fonction de résultat récupérera une copie. Si vous marquez un paramètre en structtant que inout, cela signifie que ce paramètre devient varet vous pouvez modifier un état de structet ces modifications seront visibles en dehors de la portée de la fonction
//func foo(myStruct: StructA) { //Compile ERROR: line - myStruct.a = 10: Cannot assign to property: 's' is a 'let' constant
func foo(myStruct: inout StructA) {
myStruct.a = 10
}
//using
//foo(myStruct: &letStructA) // Compile EROOR: Cannot pass immutable value as inout argument: 'letStructA' is a 'let' constant
foo(myStruct: &varStructA)
Utilisez letquand vous le pouvez. Utilisez varquand vous le devez.