let
- constant
var
-variable
[Konstan vs variabel]
[Struct vs Class]
Doc .swift.org resmi mengatakan
Nilai a constant
tidak dapat diubah setelah diatur, sedangkan a variable
dapat 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 struct
dapat 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 classes
adalah mutable
a-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 struct
tipe nilai, itu dilewatkan oleh nilai sebagai fungsi hasil akan mengambil salinan. Jika Anda menandai struct
sebagai inout
parameter, artinya parameter ini menjadi var
dan Anda dapat mengubah status struct
dan 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 let
kapan pun Anda bisa. Gunakan var
saat Anda harus.