let- constant
var-variable
[Costante vs variabile]
[Struct vs Class]
Dice doc ufficiale docs.swift.org
Il valore di a constantnon può essere modificato una volta impostato, mentre a variablepuò essere impostato su un valore diverso in futuro.
Questa terminologia in realtà descrive un meccanismo di riassegnazione
Mutabilità - modificabile - lo stato dell'oggetto può essere modificato dopo la creazione

Valore e tipo di riferimento [Informazioni]
Valore (Struct, Enum)
Gli Swift structpossono cambiare il loro stato di mutabilità:
let+ struct= immutable= Costante di valore
Può non essere riassegnato o modificato
var+ struct= mutable
Può essere riassegnato o modificato
Tipo di riferimento (classe)
Gli Swift classessono mutableun priorato
let+ class= Costante di indirizzo
Può non essere riassegnato e può essere cambiato
var+ class
Può essere riassegnato o modificato
//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 - Funzioni mutanti di Struct
È possibile contrassegnare il metodo di struct comemutating
- Indica che questa funzione modifica i valori delle proprietà interne.
- Può essere utilizzato solo su
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 Modifica di una struttura all'interno di una funzione
È possibile contrassegnare il parametro di una funzione (che è struct) come inout
Dal momento che structun tipo di valore, viene passato per valore poiché una funzione risultante recupererà una copia. Se si contrassegna un parametro structcome inoutsignifica che questo parametro diventa vare si è in grado di cambiare uno stato di structe queste modifiche saranno visibili al di fuori dell'ambito della funzione
//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)
Usa letquando puoi. Utilizzare varquando è necessario.