Untuk memahami perbedaan antara Structs dan Classes, kita perlu mengetahui perbedaan utama antara nilai dan tipe referensi. Structs adalah tipe nilai dan itu berarti bahwa setiap perubahan pada mereka hanya akan mengubah nilai itu, Kelas adalah tipe referensi dan setiap perubahan dalam tipe referensi akan mengubah nilai yang dialokasikan di tempat memori atau referensi itu. Sebagai contoh:
Mari kita mulai dengan Kelas, kelas ini sesuai dengan Equatable hanya untuk dapat membandingkan contoh, kita membuat instance yang dipanggil pointClassInstanceAdan lainnya yang disebut pointClassInstanceBkita menugaskan kelas A ke kelas B, sekarang pernyataan mengatakan bahwa mereka adalah sama ...
class PointClass: Equatable {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
static func == (lhs: PointClass, rhs: PointClass) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
}
var pointClassInstanceA = PointClass(x: 0, y: 0)
var pointClassInstanceB = pointClassInstanceA
assert(pointClassInstanceA==pointClassInstanceB)
pointClassInstanceB.x = 10
print(pointClassInstanceA.x)
//this prints 10
Ok, apa yang terjadi di sini mengapa jika kita hanya mengubah nilai x dari pointsClassInstanceB juga mengubah nilai x dari pointClassInstanceA? baik, ini menunjukkan bagaimana tipe referensi bekerja, ketika kita menetapkan instance A, sebagai nilai instance B dan kemudian kita memodifikasi X salah satunya, itu akan mengubah kedua X karena mereka berbagi referensi yang sama dan apa yang berubah adalah nilai dari itu referensi.
Mari kita lakukan hal yang sama tetapi dengan sebuah struct
struct PointStruct: Equatable {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
static func == (lhs: PointStruct, rhs: PointStruct) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
}
var pointStructInstanceA = PointStruct(x: 0, y: 0)
var pointStructInstanceB = pointStructInstanceA
assert(pointStructInstanceA==pointStructInstanceB)
pointStructInstanceB.x = 100
print(pointStructInstanceA.x)
//this will print 0
Kami pada dasarnya memiliki struktur yang sama dengan kelas kami, tetapi sekarang Anda dapat melihat bahwa ketika Anda mencetak nilai x pointStructInstanceA hal ini tidak berubah, dan ini karena tipe nilai bekerja secara berbeda dan setiap perubahan pada salah satu instance mereka akan menjadi " independen "dan tidak akan mempengaruhi yang lain.
Swift menyarankan untuk menggunakan lebih banyak tipe nilai dan Anda dapat mengatakan bahwa pustaka mereka didasarkan pada struct untuk menghindari masalah yang dibawa oleh tipe referensi, seperti memodifikasi nilai secara tidak sengaja dll. Structs adalah cara untuk melanjutkan Swift. Semoga ini bisa membantu.