let
- constant
var
-variable
[Constante vs variable]
[Estructura vs clase]
El documento oficial docs.swift.org dice
El valor de a constant
no se puede cambiar una vez que se establece, mientras que a variable
se 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 struct
puede 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 classes
son mutable
un 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 struct
un tipo de valor, se pasa por valor como resultado, la función recuperará una copia. Si marca un parámetro struct
como inout
, significa que este parámetro se convierte var
y puede cambiar un estado de struct
y 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 let
siempre que pueda. Úselo var
cuando sea necesario.