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
коли потрібно.