let- constant
var-variable
[Constante vs variable]
[Estructura vs clase]
El documento oficial docs.swift.org dice
El valor de a constantno se puede cambiar una vez que se establece, mientras que a variablese puede establecer en un valor diferente en el futuro.
Esta terminología en realidad describe un mecanismo de reasignación
Mutabilidad - modificable - el estado del objeto se puede cambiar después de la creación

Valor y tipo de referencia [Acerca de]
Valor (estructura, enumeración)
Swift structpuede cambiar su estado de mutabilidad:
let+ struct= immutable= Constante de valor
Puede no ser reasignado o cambió
var+ struct= mutable
Se puede reasignar o cambiar
Tipo de referencia (clase)
Los veloces classesson mutableun priorato
let+ class= Constante de dirección
Puede no ser reasignado y puede ser cambiado
var+ class
Se puede reasignar o cambiar
//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 - Funciones de estructura mutante
Puede marcar el método de una estructura comomutating
- Indica que esta función cambia los valores de propiedad internos.
- Solo se puede usar en
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 Modificar estructura dentro de una función
Puede marcar el parámetro de una función (que es struct) como inout
Dado que es structun tipo de valor, se pasa por valor como resultado, la función recuperará una copia. Si marca un parámetro structcomo inout, significa que este parámetro se convierte vary puede cambiar un estado de structy estos cambios serán visibles fuera del alcance de la función
//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)
Úselo letsiempre que pueda. Úselo varcuando sea necesario.