let
- constant
var
-variable
[Константа против переменной]
[Структура против класса]
Официальный документ docs.swift.org говорит
Значение a constant
не может быть изменено после его установки, тогда как a variable
может быть установлено на другое значение в будущем.
Эта терминология фактически описывает механизм переназначения
Изменчивость - изменяемая - состояние объекта может быть изменено после создания
Значение (структура, перечисление)
Swift struct
могут изменить свой статус изменчивости:
let
+ struct
= immutable
= Константа значение
может не быть переназначены или изменены
var
+ struct
= mutable
Может быть переназначен или изменен
Тип ссылки (класс)
Свифт classes
являются mutable
а-априорным
let
+ class
= Константа адреса
может не быть переназначен и могут быть изменены
var
+ class
Может быть переназначен или изменен
//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
- Функции Мутирующей Структуры
Вы можете пометить метод структуры какmutating
- Указывает, что эта функция изменяет значения внутренних свойств.
- Может использоваться только на
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
Модификация структуры внутри функции
Вы можете пометить параметр функции (который является структурой) как inout
Поскольку struct
тип значения, он передается по значению, так как в результате функция будет получать копию. Если вы пометите параметр struct
как inout
параметр, это означает, что этот параметр становится var
и вы можете изменить состояние, struct
и эти изменения будут видны за пределами области действия функции.
//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)
Используйте, let
когда можете. Используйте, var
когда нужно.