let
- constant
var
-variable
[Constante vs variable]
[Struct vs classe]
Le doc officiel docs.swift.org dit
La valeur de a constant
ne peut pas être modifiée une fois définie, tandis que a variable
peut ê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 struct
peuvent 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 classes
sont mutable
un 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 struct
un 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 struct
tant que inout
, cela signifie que ce paramètre devient var
et vous pouvez modifier un état de struct
et 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 let
quand vous le pouvez. Utilisez var
quand vous le devez.