let- constant
var-variable
[Hằng so với biến]
[Struct vs Class]
Tài liệu chính thức docs.swift.org nói
Giá trị của một constantkhông thể thay đổi một khi nó được đặt, trong khi đó variablecó thể được đặt thành một giá trị khác trong tương lai.
Thuật ngữ này thực sự mô tả một cơ chế gán lại
Khả năng thay đổi - thay đổi - trạng thái của đối tượng có thể được thay đổi sau khi tạo

Giá trị và loại tham chiếu [Giới thiệu]
Giá trị (Struct, Enum)
Swift's structcó thể thay đổi trạng thái khả năng biến đổi của họ:
let+ struct= immutable= Liên tục của giá trị
Nó có thể không được bố trí hoặc thay đổi
var+ struct= mutable
Nó có thể được gán lại hoặc thay đổi
Loại tham chiếu (Lớp)
Swift's classeslà mutablemột linh mục
let+ class= Liên tục của địa chỉ
này có thể không được bố trí và có thể được thay đổi
var+ class
Nó có thể được gán lại hoặc thay đổi
//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 - Chức năng biến đổi cấu trúc
Bạn có thể đánh dấu một phương thức của struct làmutating
- Chỉ ra rằng chức năng này thay đổi giá trị thuộc tính nội bộ.
- Chỉ có thể được sử dụng trên
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 Sửa đổi cấu trúc bên trong một chức năng
Bạn có thể đánh dấu tham số của hàm (là struct) là inout
Vì structmột loại giá trị, nó được truyền theo giá trị vì hàm kết quả sẽ truy xuất một bản sao. Nếu bạn đánh dấu structnhư inouttham số nó có nghĩa là tham số này trở thành varvà bạn có thể thay đổi tình trạng structvà những thay đổi này sẽ được bên ngoài có thể nhìn thấy trong phạm vi chức năng
//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)
Sử dụng letbất cứ khi nào bạn có thể. Sử dụng varkhi bạn phải.