Kiến thức căn bản về Swift (Phần 9) - Tìm hiểu thế mạnh của Enum



Tiếp theo bài trước, chúng ta sẽ tìm hiểu về Enum. Enumerations là một trong những design pattern có trong nhiều ngôn ngữ lập trình khác nhau như C++,C#,Objective-C. Mặc dù, nó khá giống các ngôn ngữ khác nhưng enumeration trong Swift có khá nhiều điểm khác biệt và linh hoạt. Bây giờ chúng ta sẽ bắt đầu tìm hiểu điều đó.
Để 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.


  1. Enumeration là gì ?
Enumeration không phải là một khái niệm mới và chắc chắn sẽ không riêng gì ngôn ngữ Swift có nhưng trong Swift, enumeration khá mạnh.
Trong Swift, enumeration là một lớp giá trị, nó dùng để định nghĩa ra danh sách các giá trị.
Ví dụ về các trang thái của kết nối mạng, có thể có các trạng thái sau:
    • Disconnected
    • Connecting
    • Connrcted
Theo ví dụ trên chúng ta sẽ định nghĩa một enumeration như sau:

Chúng ta sẽ dùng từ khoá enum để mô tả một enumeration và case để mô tả từng trị trong enum với tên là ConnectionState.
Đối với ngôn ngữ C, Objective-C thì một enum có thể được mô tả bằng nhiều tên khác nhau, Nhưng với Swift thì chỉ có duy nhất một tên vì thế mà nó trở nên an toàn và không phức tạp trong code.
Ngoài ra, Enumeration có thể chỉ định một kiểu dữ liệu nào đó cho toàn bộ các phần tử của nó, Bây giờ ta sẽ chỉ định enum ConnectionState với kiểu Int. Khi đó các phần tử của ConnectionState phải được gán kiểu Int, nếu gán kiểu khác Xcode sẽ thông báo lỗi.
Ví dụ 1:
Lưu ý:
Trong các phần tử của một enum không được có giá trị giống nhau. Bạn yên tâm Xcode sẽ báo lỗi nếu xảy ra giống nhau. Nếu chúng ta chỉ gán giá trị cho một phần tử, khi đó Swift sẽ tự động gán ngầm giá trị cho các phần tử còn lại, lấy giá trị chuẩn từ phần tử Unknown = -1 và tăng tự động giá trị lên. nó sẽ gián như ví dụ 1.
Ví dụ


  1. Sử dụng
Sử dụng ConnectionState cũng tương tự như các kiểu dữ liệu khác trong Swift. Theo ví dụ trước chúng ta đã mô tả ConnectionState, bây giờ chúng ta sử dụng nó như sau:

var connectionState = ConnectionState.Connecting

Giá trị của connectionState ConnectionState.Connecting.
Kiểu tự suy luận của Swift rất là tiện dụng khi áp dụng với enum, bởi vì khi khai báo hay gián trị cho biến connectionState thì chỉ cần làm như sau:

connectionState = .Connected

Enumeration thường được dùng với if hay switch, Lưu ý khi dùng với Switch phải mô tả đầy đủ các phần tử trong Switch không nó sẽ báo lỗi, và dùng default nếu cần thiết.
Ví dụ:


Thêm ví dụ về sử dụng enum :


  1. Khả năng liên kết giá trị
Một trong những tính năng hấp dẫn khác của enum trong Swift đó là liên kiết giá trị(Associated Values). Đây là tính năng quan trọng được sử dụng nhiều. Mỗi thành phần của enum có thể được mô tả thêm một giá trị liên kết nào đó(Associated value). Giá trị liên kết này là một trong những tính năng linh hoạt vì nó có thể bao gồm nhiều kiểu dữ liệu khác nhau được gắn với 1 thành phần trong enum. Để hiểu rõ hơn chúng ta tham khảo ví dụ sau:


Ví dụ:


Quan trọng ở đây chúng ta phải hiểu được liên kết giá trị(assciated value) là một liên kết hay là một liên kết với một số giá trị nào đó thông qua thành phần của một enum.
Để hiểu rõ hơn, Chúng ta sẽ xem ví dụ sau đây.
  1. Hàm và Value types
Trong Swift, Enum khá tuyệt vời. Nó có thể cho phép chúng ta định nghĩa các method,
Ví dụ:

Ngoài ra chúng ta có thể định nghĩa hàm Static trong enum.


Ví dụ:


Giống như struct, enum cũng là một kiểu dữ liệu và nó chỉ chứa giá trị nào đó. Vì thế nên nó sẽ không thể tham chiếu được như class và chỉ dùng theo kiểu trị giống như struct.
Ví dụ:


Sau bài này chúng ta đã tìm hiểu được nhiều điểm mạnh của enum trong Swift so với các ngôn ngữ khác. Ngoài điểm linh hoạt, làm cho code dễ hiểu, nó còn giúp chúng ta dễ bảo trì code về sau.
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.

Post a Comment

0 Comments