let- constant
var-variable
[Константа проти змінної]
[Структура проти класу]
Офіційний документ docs.swift.org говорить
Значення параметра constantнеможливо змінити після його встановлення, тоді як в variableмайбутньому можна встановити інше значення.
Ця термінологія фактично описує механізм перепризначення
Переміщення - змінне - стан об'єкта може бути змінено після створення

Значення та тип довідки [Про]
Значення (Struct, Enum)
Свіфт 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 - Функції мутації структури
Ви можете позначити метод struct як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коли потрібно.