let
- constant
var
-variable
[ค่าคงที่เทียบกับตัวแปร]
[โครงสร้างกับคลาส]
doc doc อย่างเป็นทางการdocs.swift.orgพูดว่า
ค่าของ a constant
ไม่สามารถเปลี่ยนแปลงได้เมื่อตั้งค่าในขณะที่ a variable
สามารถตั้งค่าเป็นค่าอื่นในอนาคต
คำศัพท์นี้อธิบายกลไกการมอบหมายใหม่
ความไม่แน่นอน - เปลี่ยนแปลงได้ - สถานะของวัตถุสามารถเปลี่ยนแปลงได้หลังจากการสร้าง
ค่า (โครงสร้าง Enum)
Swift's struct
สามารถเปลี่ยนสถานะความผันแปรได้:
let
+ struct
= immutable
= ค่าคงที่
มันไม่สามารถกำหนดใหม่หรือเปลี่ยนแปลงได้
var
+ struct
= mutable
สามารถกำหนดใหม่หรือเปลี่ยนแปลงได้
ประเภทอ้างอิง (ชั้น)
Swift's classes
เป็นmutable
a-priory
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
การปรับเปลี่ยน struct ภายในฟังก์ชั่น
คุณสามารถทำเครื่องหมายพารามิเตอร์ของฟังก์ชัน (ซึ่งคือ struct) เป็น 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
เมื่อคุณต้อง