12/08/2018, 14:51
Reference Type (class) _VS_ Value Type (enum, struct)
Mình dạy học thấy nhiều bạn còn lơ mơ về Reference Type và Value type quá nên viết lại cho mọi người rõ Value type khác Reference type Đặc điểm Value Type (Struct , enum) Reference Type (class) Kế thừa Không kế thừa được. Nhưng hoàn toàn có thể conform with protocol Còn với ...
Mình dạy học thấy nhiều bạn còn lơ mơ về Reference Type và Value type quá nên viết lại cho mọi người rõ
Value type khác Reference type
Đặc điểm | Value Type (Struct , enum) | Reference Type (class) |
---|---|---|
Kế thừa | ![]() ![]() ![]() |
![]() |
khi gán dữ liệu var a = b | tạo ra 1 bản copy mới của b sau đó gán cho a mọi thay đổi trên a đều ko liên quan đến b. Giống như việc mình cho bạn mình mượn quyển sách, bạn đó photo sách đó và dùng. Bạn viết gì lên trang sách đó ko liên quan đến quyển sách của mình. | Bản chất việc gán chỉ là việc truyền địa chỉ (pointer) cuả object từ b cho a. (b chứa địa chỉ của object (pointer) và gán địa chỉ đó cho a) Khi đó cả a và b cùng trỏ đến 1 vùng nhớ chung. Việc này giống như việc mình cho bạn biết chỗ cất sách, mình và bạn cùng dùng chung quyển sách đó, khi bạn viết lên trang sách thì quyển sách đó cũng ảnh hưởng đến mình. |
![]() |
![]() |
|
Khi bạn khai báo let car = Car() | ![]() |
![]() |
Khi bạn thêm 1 method | ![]() |
![]() |
Khi truyền như một tham số cho function | ![]() |
![]() |
Trong thực tế | ![]() |
![]() |
Các loại dữ liệu hay gặp | String, Int, Double, CGPoint, CGSize, CGFloat, Array, Dictionary , đều là Value Type | UIView, UIViewController, UITableView,... là các Reference Type. Lưu ý: NSString, NSNumber, NSArray, and NSDictionary cũng là các reference Type |
Khi nào chúng ta chọn sử dụng Struct hoặc Class ?
Chúng ta có thể sử dụng struct trong một trong những điều kiện dưới đây:
- Để đóng gói những giá trị khá đơn giản
- Bạn mong đợi giá trị đóng gói được sao chép hơn là tham chiếu đến khi bạn gán hoặc truyền quanh các instance của struct đó.
- Tất cả các stored property của struct đều phải là value Type, và cũng mong muốn copy thay cho tham chiếu
- Cấu trúc không cần kế thừa từ một loại nào khác.
Ví dụ một số suggest khi dùng Struct
struct ShapeSize { var height: Double var weight: Double } struct Range { var startPoint: Int var length: Int } struct 3DCoordinateSystem { var x: Double var y: Double var z: Double }
Chúng ta sử dụng Class trong hầu hết các trường hợp khác.