let
- constant
var
-variable
[Costante vs variabile]
[Struct vs Class]
Dice doc ufficiale docs.swift.org
Il valore di a constant
non può essere modificato una volta impostato, mentre a variable
può 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 struct
possono 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 classes
sono mutable
un 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 struct
un tipo di valore, viene passato per valore poiché una funzione risultante recupererà una copia. Se si contrassegna un parametro struct
come inout
significa che questo parametro diventa var
e si è in grado di cambiare uno stato di struct
e 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 let
quando puoi. Utilizzare var
quando è necessario.