Để hiểu được sự khác biệt giữa Structs và Classes, chúng ta cần biết sự khác biệt chính giữa các loại giá trị và tham chiếu. Cấu trúc là các loại giá trị và điều đó có nghĩa là mọi thay đổi trên chúng sẽ chỉ sửa đổi giá trị đó, Các lớp là các loại tham chiếu và mọi thay đổi trong loại tham chiếu sẽ sửa đổi giá trị được phân bổ ở vị trí của bộ nhớ hoặc tham chiếu. Ví dụ:
Chúng ta hãy bắt đầu với một Class, lớp này phù hợp với Equitable chỉ để có thể so sánh các thể hiện, chúng ta tạo một thể hiện được gọi pointClassInstanceA
và khác được gọi là pointClassInstanceB
chúng ta gán lớp A cho lớp B, bây giờ khẳng định nói rằng chúng giống nhau ...
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, điều gì đã xảy ra ở đây tại sao nếu chúng ta chỉ thay đổi giá trị x của pointsClassInstanceB thì nó cũng thay đổi giá trị x của pointClassInstanceA? tốt, điều này cho thấy các kiểu tham chiếu hoạt động như thế nào, khi chúng ta gán thể hiện A, như một giá trị của thể hiện B và sau đó chúng ta sửa đổi X của một trong số chúng, nó sẽ thay đổi cả X vì chúng chia sẻ cùng một tham chiếu và giá trị của thay đổi đó là gì tài liệu tham khảo.
Chúng ta hãy làm tương tự nhưng với một cấu trúc
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
Về cơ bản, chúng tôi có cấu trúc giống như lớp của chúng tôi nhưng bây giờ bạn có thể thấy rằng khi bạn in giá trị x của pointStstallInstanceA thì trường hợp này không thay đổi và điều này là do các loại giá trị hoạt động khác nhau và mọi thay đổi trên một trong các trường hợp của chúng sẽ là " độc lập "và sẽ không ảnh hưởng đến người khác.
Swift đề nghị sử dụng nhiều loại giá trị hơn và bạn có thể nói rằng các thư viện của họ dựa trên các cấu trúc để tránh các vấn đề mà các loại tham chiếu mang lại, như vô tình sửa đổi một giá trị, v.v. Hy vọng nó giúp.