let- constant
var-variable
[Stała vs zmienna]
[Strukt vs klasa]
Oficjalny dokument docs.swift.org mówi
Wartość parametru constantnie można zmienić po jego ustawieniu, natomiast wartość parametru a variablemożna ustawić na inną wartość w przyszłości.
Ta terminologia faktycznie opisuje mechanizm zmiany przypisania
Zmienność - zmienna - stan obiektu można zmienić po utworzeniu

Wartość i typ odniesienia [Informacje]
Wartość (struktura, wyliczenie)
Swift structmoże zmienić swój status zmienności:
let+ struct= immutable= Stała wartość
To może nie być przeniesiona lub zmieniona
var+ struct= mutable
Można go ponownie przypisać lub zmienić
Typ odniesienia (klasa)
Szybkie classessą mutablea-priory
let+ class= Stała adresu
To może nie być przeniesiony i może być zmieniona
var+ class
Można go ponownie przypisać lub zmienić
//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 - Funkcje mutujące struktury
Możesz oznaczyć metodę struct jakomutating
- Wskazuje, że ta funkcja zmienia wartości właściwości wewnętrznych.
- Można używać tylko na
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 Modyfikacja struktury w funkcji
Możesz oznaczyć parametr funkcji (który jest struct) jako inout
Ponieważ structtyp wartości jest przekazywany przez wartość, ponieważ funkcja wyniku pobierze kopię. Jeśli zaznaczysz structjako inoutparametr, oznacza to, że ten parametr staje się vari możesz zmienić stan, structa zmiany te będą widoczne poza zakresem funkcji
//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)
Używaj, letkiedy tylko możesz. Użyj, varkiedy musisz.