Tản mạn về Class trong Swift
Bài đăng này đã không được cập nhật trong 3 năm
Các class giống như việc xây dựng các kiểu dữ liệu phức tạp, có nghĩa là nó chứa nhiều kiểu dữ liệu. Các class trông tương tự như một struct, nhưng có một vài điểm khác nhau. Không có phương thức init() tự động, bạn cần phải tự khai báo. Trong các class, nếu bạn tạo một bản sao của instance và bạn cố gắng thay đổi giá trị, thì giá trị của đối tượng gốc cũng sẽ bị thay đổi. Instance của class được gọi là một object.
Khởi tạo một đối tượng
Các biến được khai báo bên trong các class được gọi là property và các function bên trong một class được gọi là method. Nếu chúng ta khởi tạo class của mình như một struct, Swift sẽ không cho phép chúng ta biên dịch code của mình. Trong struct, nó tự động init các property nhưng trong các class, bạn cần tự tạo init() của riêng mình.
Để làm điều này, tạo một method bên trong class và gọi nó là init().
Bạn cần lưu ý rằng trước phương thức init (), không viết func vì init () này là đặc biệt. Chúng ta đang truyền cùng một tên thuộc tính trong phương thức init () nên bạn cần sử dụng self. để làm cho có ý nghĩa hơn rằng chúng ta đang gán những giá trị đó cho thuộc tính bên trong các class. Việc tạo các instances của class đó trông giống như struct:
Kế thừa Class
Một class dựa trên một class hiện có kế thừa tất cả các thuộc tính và phương thức của nó và thêm một đoạn code lên trên các phương thức được kế thừa được gọi là Kế thừa class. Class bạn kế thừa được gọi là parent class hoặc superclass và class mới được gọi là child class. Dấu hai chấm giữa class có nghĩa là class Employee mở rộng class Person.
Ở đây, chúng ta đang tạo một class Employee mới và chúng ta đang kế thừa tất cả các thuộc tính và phương thức của Person.
Chúng ta cũng có thể cung cấp cho Employee trình khởi tạo của riêng chúng ta như thế này
Swift luôn cho phép bạn super.init () vì một số công việc quan trọng phải được thực hiện khi parent class được khởi tạo.
Function Overriding
Tôi đã tạo một hàm aboutMe () trong parent class, tức là trong class Person:
Trong Swift nếu bạn muốn sử dụng cùng một phương thức trong child class tồn tại trong parent class thì bạn nên biết về từ khóa: override. Điều này sẽ giúp bạn thực thi hàm parent class cũng như hàm child class nếu bạn sử dụng super.
Nếu bạn sử dụng super.aboutMe () trong child class thì nó sẽ thực thi hàm parent class và sau đó nó sẽ thực thi hàm child class.
Ở đây bạn có thể thấy hàm parent class được thực thi đầu tiên và sau đó hàm child class được thực thi.
Ở đây super.aboutMe () được viết ở cuối hàm, đó là lý do tại sao hàm child class được thực thi trước rồi mới đến parent class.
Ở đây tôi đã loại bỏ hàm super.aboutMe (), đó là lý do tại sao hàm parent class không được thực thi ở đây.
Final Classes
Đôi khi bạn muốn không cho phép các nhà phát triển xây dựng class của riêng họ dựa trên class của bạn, vì vậy trong trường hợp đó, bạn có thể sử dụng từ khóa final trước class của mình để không nhà phát triển nào khác có thể thay đổi hành vi của class của bạn.
Trong trường hợp của chúng ta, tôi đã thêm keywoard final trước Person. Nó tạo ra một lỗi trong class Employee vì chúng ta không thể kế thừa class Person.
Copying Objects
Trong class, nếu bạn sao chép một object thì cả object gốc và object trùng lặp đều trỏ đến cùng một giá trị có nghĩa là nếu bạn thay đổi giá trị của object gốc thì giá trị object trùng lặp cũng thay đổi theo.
Vì vậy, bây giờ tôi đang cố gắng thay đổi giá trị của giá trị Employee ban đầu, hãy xem điều gì sẽ xảy ra.
Ở đây bạn có thể thấy rõ tôi đã thay Employee name ban đầu, tức là emp1 từ “Joy” thành “Agnel Selvan”. Giá trị cũng bị thay đổi trong emp1Copy, điều này là do cả hai object đều trỏ đến cùng một vị trí trong bộ nhớ.
Deinitializers in Classes
Bạn có thể chạy code khi instance của class bị hủy, nó được gọi là Deinitializers. Bạn cần viết code khi instance của class bị hủy bên trong deinit.
Hãy minh họa bằng một ví dụ bằng cách tạo một vòng lặp Employee để instance Employee mới sẽ được tạo và sau đó bị hủy.
Mutability
Nếu bạn có một class hằng với thuộc tính biến, thuộc tính đó có thể được thay đổi. Bởi vì các class này không cần từ khóa mutating.
Nếu bạn muốn tránh thay đổi giá trị thuộc tính của biến thì bạn cần phải làm cho biến đó không đổi bằng cách thêm từ khóa let. Như thế này
nguồn tham khảo: More about classes in Swift
All rights reserved