Nối tiếp những bài trước về chủ đề lập trình hướng đối tượng trong Swift. Hôm nay mình sẽ hướng dẫn bạn một kỹ thuật mới để làm việc với class. Đó là kỹ thuật mở rộng class bằng Extension.
Extension là gì
Extensions cho phép bạn bổ sung thêm chức năng mới cho class, struct, hoặc enum hiện có mà không cần phải viết lại (kể cả khi bạn không có mã nguồn).
Đặc điểm của Extension trong Swift
Extensions trong Swift có một số đặc điểm như sau:
- Bổ sung thêm các thuộc tính tính toán vào một class hiện có.
- Thêm các phương thức (Instance Methods & Type Methods) vào một class có sẵn.
- Thêm một số cách để khởi tạo đối tượng (Initializer).
- Cho phép bổ sung thêm subscripts.
- Cài đặt một giao thức (protocol).
Cú pháp khai báo Extension
Bạn khai báo extension tương tự như khai báo class, cú pháp như sau:
➤ Ví dụ: Để cho bạn dễ hình dung, mình sẽ khai báo extention bổ sung thêm các thuộc tính cho phép đổi đơn vị sang hệ m cho kiểu Double của hệ thống.
Bạn hãy lưu ý, Double là kiểu dữ liệu có sẵn của hệ thống, chúng ta hoàn toàn không có source của kiểu này. Nhưng nhờ Extension mà chúng ta có thể bổ sung thêm các thuộc tính cho kiểu Double. Như ví dụ trên, mình bổ sung thêm các thuộc tính cho phép chuyển đổi đơn vị chiều dài khác sang hệ m (met).
Sử dụng Extension
Cách thức sử dụng extension cũng tương tự như việc bạn sử dụng một class nào đó. Bạn có thể dùng dấu “.” để truy xuất các thành phần được bổ sung thêm trong extension.
➤ Ví dụ: Mình áp dụng luôn extension Double đã xây dựng trong ví dụ trước nhé.
Trong ví dụ trên, mình đổi số 25.4 có đơn vị là mm sang m và số 3 có đơn vị là ft sang m. Bạn cần nhớ là extension chỉ là nhiệm vụ là bổ sung thêm chứ không “ghi đè” nhé. Vì vậy mà những thuộc tính hoặc các phương thức khác của Double vẫn có thể sử dụng bình thường. Rất tiện phải không nào?
➤ Lưu ý: extension chỉ cho phép bổ sung thuộc tính tính toán nhưng không cho phép bổ sung thuộc tính lưu trữ (set giá trị) hoặc theo dõi giá trị (willSet hoặc didSet).
Bổ sung thêm hàm chức năng
Bên cạnh việc bổ sung thuộc tính như trên, extension cũng cho phép bạn bổ sung thêm các hàm chức năng cho một class có sẵn nào đó.
➤ Ví dụ: Bổ sung thêm 03 hàm cho kiểu Double như sau.
Ngoài ra, extension cũng hỗ trợ bạn bổ sung thêm phương thức khởi tạo cho một class có sẵn nào đó. Nhưng bạn cần lưu ý là extension chỉ cho phép bổ sung phương thức khởi tạo convenience thôi nhé. Bạn còn nhớ class Rectangle ở bài viết trước không? Mình sẽ sử dụng extension để bổ sung thêm phương thức khởi tạo cho class Rectangle nhé.
Tổng kết
Thực tế thì extension cũng được sử dụng khá thường xuyên do chúng ta không cần tới source gốc mà vẫn có thể bổ sung chức năng cho một class nào đó. Việc sử dụng extension khá đơn giản nhưng lại rất hiệu quả phải không nào? Vì vậy bạn cũng nên quan tâm tới nó nhé.