let- constant
var-variable
[Konstan vs variabel]
[Struct vs Class]
Doc .swift.org resmi mengatakan
Nilai a constanttidak dapat diubah setelah diatur, sedangkan a variabledapat diatur ke nilai yang berbeda di masa mendatang.
Terminologi ini sebenarnya menggambarkan mekanisme penugasan kembali
Mutabilitas - dapat diubah - status objek dapat diubah setelah pembuatan

Nilai dan Jenis Referensi [Tentang]
Nilai (Struct, Enum)
Swift's structdapat mengubah status mutabilitas mereka:
let+ struct= immutable= Konstan nilai
Hal ini dapat tidak akan ditugaskan kembali atau diubah
var+ struct= mutable
Ini dapat dipindahkan atau diubah
Tipe Referensi (Kelas)
Swift classesadalah mutablea-priorat
let+ class= konstanta alamat
Ini tidak dapat dipindahkan dan dapat diubah
var+ class
Ini dapat dipindahkan atau diubah
//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 - Mutasi Fungsi Struct
Anda dapat menandai metode struct sebagaimutating
- Menunjukkan bahwa fungsi ini mengubah nilai properti internal.
- Hanya bisa digunakan di
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 Memodifikasi struct di dalam suatu fungsi
Anda dapat menandai parameter fungsi (yang merupakan struct) sebagai inout
Karena structtipe nilai, itu dilewatkan oleh nilai sebagai fungsi hasil akan mengambil salinan. Jika Anda menandai structsebagai inoutparameter, artinya parameter ini menjadi vardan Anda dapat mengubah status structdan perubahan ini akan terlihat di luar lingkup fungsi
//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)
Gunakan letkapan pun Anda bisa. Gunakan varsaat Anda harus.