let
- constant
var
-variable
[Stała vs zmienna]
[Strukt vs klasa]
Oficjalny dokument docs.swift.org mówi
Wartość parametru constant
nie można zmienić po jego ustawieniu, natomiast wartość parametru a variable
moż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 struct
moż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 classes
są mutable
a-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ż struct
typ wartości jest przekazywany przez wartość, ponieważ funkcja wyniku pobierze kopię. Jeśli zaznaczysz struct
jako inout
parametr, oznacza to, że ten parametr staje się var
i możesz zmienić stan, struct
a 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, let
kiedy tylko możesz. Użyj, var
kiedy musisz.