let
- constant
var
-variable
[Konstante gegen Variable]
[Struktur gegen Klasse]
Offizielle doc docs.swift.org sagt
Der Wert von a constant
kann nicht geändert werden, sobald er festgelegt wurde, während a variable
in Zukunft auf einen anderen Wert festgelegt werden kann.
Diese Terminologie beschreibt eigentlich eine Umhängen Mechanismus
Veränderbarkeit - veränderbar - Der Status des Objekts kann nach der Erstellung geändert werden
Wert und Referenztyp [Info]
Wert (Struktur, Aufzählung)
Swifts struct
können ihren Veränderbarkeitsstatus ändern:
let
+ struct
= immutable
= Wertekonstante
Sie kann nicht neu zugewiesen oder geändert werden
var
+ struct
= mutable
Es kann neu zugewiesen oder geändert werden
Referenztyp (Klasse)
Swifts classes
sind mutable
ein Priorat
let
+ class
= Adresskonstante
Sie kann nicht neu zugewiesen und geändert werden
var
+ class
Es kann neu zugewiesen oder geändert werden
//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
- Funktionen von Mutating Struct
Sie können die Methode einer Struktur als markierenmutating
- Gibt an, dass diese Funktion interne Eigenschaftswerte ändert.
- Kann nur auf
var
+ verwendet werdenstruct
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
Struktur innerhalb einer Funktion ändern
Sie können den Parameter einer Funktion (der struct ist) als markieren inout
Da struct
ein Werttyp als Wert übergeben wird, ruft die Ergebnisfunktion eine Kopie ab. Wenn Sie einen struct
als inout
Parameter markieren , bedeutet dies, dass dieser Parameter wird var
und Sie einen Status von ändern können struct
und diese Änderungen außerhalb des Funktionsumfangs sichtbar sind
//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)
Verwenden let
Sie, wann immer Sie können. Verwenden var
Sie, wenn Sie müssen.