Trong bài viết trước chúng ta đã tìm hiểu về Optional, tiếp theo bài này chúng ta sẽ tìm hiều thêm một thế mạnh khác của Swift. Đó chính là Extension. Nó là gì? Và tại sao nó lại là thế mạnh của Swift. Bây giờ chúng ta sẽ tìm hiểu thông qua bài bên dưới.
Để bắt đầu cho bài hướng dẫn này, các bạn nên sử dụng Xcode Playground để thực hành code theo các ví dụ trong bài, nó giúp bạn sẽ dễ hiểu và nhớ lâu hơn.
Chạy Xcode 9, tạo mới một Playground và tiến hành tìm hiểu.
- Khái niệm và cú pháp
Extensions là một tính năng mới và chỉ được dùng cho class, Struct, enumeration hoặc Protocol. Nó có khả năng mở rộng để có thể thêm các hàm hoặc các Properties mới cho Class, Struct , Enumeration hoặc Protocol, Nếu bạn nào đã tìm hiểu Objective-C thì sẽ thấy nó giống với tính năng Categories. Khác với Categories, Extension không có tên.
Extension có thể:
- Thêm mới các instance Properties hoặc Type Properties(Các properties này thực thi xử lý tính toán và trả về cái gì đó, để hiểu rõ chúng ta sẽ tìm rõ hơn ở bên dưới)
- Định nghĩa thêm các instance methods hoặc type methods
- Định nghĩa thêm các hàm khởi tạo mới
- Định nghĩa thêm các subscripts
- Extenstion có thể thêm mới một hàm mới nhưng không thể override hàm đó được.
- Sử dụng các nested type
- Thực hiện các phương thức của protocol
Cú pháp(Syntax)
Để mô tả một extensions chúng ta dùng từ khóa extension
Ví dụ:
Ở đây extension có khả năng chấp nhận một hoặc nhiều protocol cùng một lúc, cũng tương tự như class hay Struct.
Ví dụ:
Lưu ý:
Nếu bạn dùng extension để định nghĩa một hàm mới hoặc properties mới cho một kiểu dữ liệu nào đó, khi đó hàm đó hoặc properties đó sẽ tồn tại trong tất cả các instances của kiểu dữ liệu đó.
- Tính năng
- Computed Properties
Extension cho phép chúng ta thêm các thuộc tính liên quan tới tính toán (computed instance properties) và (computed type properties) vào các kiểu dữ liệu đã được định nghĩa. Để hiểu rõ hơn chúng ta sẽ xem ví dụ sau đây.
Ví dụ extension thêm 5 thuộc tính(computed instance properties):
Vậy computed instance properties là một thuộc tính liên quan tới tính toán và được dùng cho chính bản thân của instance, trong thuộc tính đó sẽ dùng từ khoá self để tính toán, xử lý cái gì đó. Như ví dụ trên ta thấy km là một thuộc tính như vậy và được tính toán như sau { return self * 1_000.0}.
Ví dụ về extension thêm các thuộc tính(computed properties type):
Vậy computed properties type là một thuộc tính liên quan tới tính toán và xử lý cái gì đó, khi dùng thuộc tính đó, chúng ta sẽ không cần phải tạo mới một đối tượng để gọi thuộc tính đó, có nghĩa là chúng ta có thể gọi trực tiếp như ví dụ trên Double.meters, UserDefaults.passwordKey.
Lưu ý:
Extension không thể tạo thêm một thuộc tính mới mà thuộc tính đó có chứa một giá trị cụ thể nào đó. Xcode sẽ thông báo lỗi ngay lập tức khi chúng ta extension như ví dụ bên dưới.
Ví dụ:
- Initializaion
Để hiểu rõ hơn chúng ta sẽ đi nhanh vào ví dụ sau:
Ở đây chúng ta sẽ sử dụng hàm khởi tạo mặc định của struct trên như sau:
Bây giờ chúng ta sẽ extension thêm hàm khởi tạo cho struct trên như sau:
và dùng nó:
- Method
Extension cho chúng ta thêm cả instance method và type method, Dưới đây chúng ta sẽ ví dụ từng loại method để bạn dễ hình dung hơn.
Ví dụ về extension thêm instance method.
- Vậy instance method cũng giống như instance properties, nó là một hàm dùng để xử lý một cái gì đó nhưng nó dùng chính bản thân đối tượng gọi hàm đó để xử lý. như ví dụ trên chúng ta sẽ thấy số 3 sử dụng hàm repetitions và trong hàm đó sẽ dùng chính số 3 trong việc in ra chữ Hello! 3 lần.
- Subscripts
Ví dụ về extension thêm type method.
Bạn có thể thấy hàm closestToOrigin tlà một type method, cũng tương tự như type properties. Nó sẽ được gọi một cách trực tiếp từ Object Point, không cần phải tạo mới object Point rồi mới gọi dc.
Lưu ý:
Có thể thay static func closestToOrigin(p1: Point, _ p2: Point) -> Point
thành class func closestToOrigin(p1: Point, _ p2: Point) -> Point , nó cũng là một type method.
Có thể extension mutating instance method, để hiểu loại method này như thế nào bạn xem ví dụ sau:
Trong Swift có hỗ trợ cho chúng ta từ khoá subscript, dùng để hỗ trợ việc truy xuất dữ liệu một cách nhanh gọn. Và khi dùng extension chúng ta có thể thêm subscript cho một kiểu dữ liệu nào đó đã được định nghĩa.
Ví dụ về extension Int:
- Nested Types
Nested types là tạo một dữ liệu mới lồng trong một dữ liệu khác, tất nhiên là dữ liệu mới được tạo chỉ có phạm vi sử dụng trong dữ liệu được lồng thôi.
Ví dụ:
Sử dụng như sau:
3. Source code về Extension.
Ở đây mình có một link Github về Extension:
- Chứa hơn 500 source về Extension.
- SwiftLib Extension(Bool, Array, Collection, …...)
- Fundation Extension(Data, Date,... )
- UIKit Extension(UIButton, UIColor, UIIMage,...)
- AppKit Extension(NSColor, NSView,....)
- Core Graphics, Core Location.
Bạn tham khảo tại: All Extension Swift.
Qua bài này chúng ta đã tìm hiểu thêm được một thế mạnh khác mà Swift hỗ trợ cho chúng ta. Rất thuận tiện cho chúng ta tạo và bổ xung thêm nhiều properties, method để dùng lại trong toàn project.
Hy vọng các bạn thích và học được nhiều kiến thức từ bài viết này. Mong các bạn chia sẽ nó để mọi người cùng học và cùng trao đổi. Mọi thắc mắc hay trao đổi về bài viết, các bạn có thể để lại bình luận bên dưới mình sẽ hỗ trợ sớm nhất.
Chân thành cảm ơn các bạn đã theo dõi.
VHX.
0 Comments