Trong swift: Class là gì? Struct là gì? Có liên quan gì đến Value type và Reference type không?
Bài đăng này đã không được cập nhật trong 4 năm
Class và Struct có liên quan gì đến Value type và Reference type không? Câu trả lời là có . Bởi vậy đầu tiên chúng ta cùng tìm hiểu về Value type và Reference type trước.
Value type và Reference type
Trước tiên các bạn nên biểt việc khai báo:
- let: hằng số, không thể thay đổi
- var: biến số, có thể thay đổi
Khi bạn khai báo một biến, ngay tại thời điểm này một ô nhớ đã được tạo ra để lưu property.
1. Value type (kiểu giá trị) (struct, enum, string, int, Double, CGPoint, CGSize, CGFloat, Array, Dictionary): Bản chất là coppy dữ liệu
Ở ví dụ trên, khi khai báo let girl1 = Girl()
, ngay lúc này một ô nhớ đã được tạo ra để chứa dữ liệu của struct và gán cho girl1
. Ở lần gán thứ 2, tương tự, một ô nhớ nữa được tạo ra, chứa bản coppy dữ liệu của girl1
và gán cho girl2
. Lúc này việc ta thay đổi dữ liệu trên girl2
không liên quan gì đến girl1
và bạn phải khai báo là var vì bạn đang thay đổi property của girl2
Method cần khai báo thêmmutating
vì bản chất của Value type là coppy, không sửa. Lúc này một name
mới được tạo ra lưu property
đã thay đổi và thay vào name
ban đầu.
2. Reference type (kiểu tham chiếu) (class, UIView, UIViewController, UITableView,..., NSString, NSNumber, NSArray, and NSDictionary ): Bản chất là tham chiếu đến ô nhớ
Ở ví dụ trên, khi khai báo let girl1 = Girl()
, một ô nhớ được tạo ra chứa dữ liệu của class và gán địa trỉ ô nhớ đó cho girl1
. Ở lần gán thứ 2, địa trỉ ô nhớ chứa dữ liệu của class tiếp tục được gán cho girl2
. Phép gán ở đây đơn giản chỉ là việc truyền địa trỉ ô nhớ giữa các object. Nên khi ta thay đổi property của girl2 không cần khai báo var. Việc thay đổi property diễn ra trực tiếp trên ô nhớ
Method có thể trực tiếp thay đổi property vì là kiểu tham chiếu
Bây giờ hãy thử giải thích 2 ví dụ sau:
- Tại sao struct lại lỗi (xem bài https://viblo.asia/p/trong-swift-func-la-gi-closure-la-gi-GrLZDpOBZk0)
- Tại sao lại có sự khác nhau này (ở bài viết về hàm khởi tạo mình sẽ giải thích)
- Tại sao lại có sự khác nhau này
Class là gì? Struct là gì? Có gì giống nhau và khác nhau?
1. Class là gì?, Struct là gì?
- Class là một bản thiết kế, chứa các thuộc tính (property) để lưu giá trị và các phương thức (method) để thực hiện một chức năng nào đó.
- Struct cũng giống class nhưng chủ yếu được sử dụng để cấu trúc cho một nhóm dữ liệu đơn giản.
- Đều có thể extension và conform protocol
2. Giống nhau:
- Đều là một bản thiết kế, có thể khai báo property, method, subscript
- Đều sử dụng được bộ khởi tạo (init)
- Đều cho phép conform Protocol, và sử dụng Extension
3. Khac nhau:
Class | Struct | |
---|---|---|
1 | Reference type (kiểu tham chiếu) | Value type (kiểu giá trị) |
2 | Có tính kế thừa: Kế thừa từ class khác, struct, ... | |
3 | Có thêm toán tử đồng nhất thức (===) để xác định 2 object có tham chiếu đến cùng một ô nhớ không | |
4 | Có hàm deinit |
Tại sao Class có hàm deinit còn truct thì không? Mình sẽ giải thích trong bài "Cơ chế quản lý bộ nhớ"
Vậy khi nào thì nên sử dụng Struct:
- Để cấu trúc cho một nhóm dữ liệu đơn giản, liên quan đến nhau
- Bạn muốn dữ liệu sẽ được sao chép rêng biệt, không liên quan đến nhau.
Tham khảo: https://viblo.asia/p/reference-type-class-vs-value-type-enum-struct-ORNZq3e850n
All rights reserved