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когда нужно.