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 constant
không thể thay đổi một khi nó được đặt, trong khi đó variable
có 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 struct
có 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 classes
là mutable
mộ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ì struct
mộ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 struct
như inout
tham số nó có nghĩa là tham số này trở thành var
và bạn có thể thay đổi tình trạng struct
và 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 let
bất cứ khi nào bạn có thể. Sử dụng var
khi bạn phải.