12/08/2018, 17:18

Trong swift: Class là gì? Struct là gì? Có liên quan gì đến Value type và Reference type không?

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. 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 ...

Class và Struct có liên quan gì đến Value type và Reference type không? Câu trả lời là . Bởi vậy đầu tiên chúng ta cùng tìm hiểu về Value type và Reference type trước.

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 girl = Girl(), ngay lúc này một ô nhớ đã được tạo ra để chứa bản coppy dữ liệu từ struct và gán cho girl. Ở lần gán thứ 2, tương tự, một ô nhớ nữa được tạo ra, chứa bản coppy của girl và gán cho girlCoppy. Lúc này việc ta thay đổi dữ liệu trên girlCoppy không liên quan gì đến girl và bạn phải khai báo là var vì bạn đang thay đổi property của girlCoppy

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 girl = Girl(), một ô nhớ được tạo ra, ô nhớ này chứa dữ liệu của class và gán địa trỉ ô nhớ đó cho girl. Ở 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 girls. 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 girls không cần khai báo var, bởi địa trỉ ô nhớ không hề thay đổi. 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

Hay bạn cứ hiểu đơn giản: Value type giống như bạn mượn vợ thằng bạn, đem đi photo và dùng bản photo đó. Còn Reference type thì giống như bạn và thằng bạn của bạn dùng chung vợ vậy.

Tham khảo: https://www.raywenderlich.com/112027/reference-value-types-in-swift-part-1

Bây giờ hãy thử giải thích 2 ví dụ sau:

  1. Tại sao struct lại lỗi (xem bài https://viblo.asia/p/trong-swift-func-la-gi-closure-la-gi-GrLZDpOBZk0)

  1. 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)

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 liên quan đến nhau

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

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

0