Bắt đầu từ bài viết này, mình sẽ chuyển sang phần mới trong lập trình Swift. Mình sẽ tập trung vào hướng dẫn bạn thao tác với các dạng dữ liệu có cấu trúc trong Swift. Và bài viết này mình sẽ trình bày kiểu liệt kê enum trong Swift. Qua đó bạn sẽ học được phương pháp khai báo và sử dụng enum trong Swift. Đây sẽ là bài viết mở đầu cho loạt bài về dữ liệu có cấu trúc trong Swift. Bạn hãy theo dõi nhé.


enum là gì?


Nếu bạn đã biết một ngôn ngữ lập trình nào đó rồi thì chắc chắn không xa lạ gì với kiểu enum. Nhưng trong bài này mình hãy cùng nhau tìm hiểu thử enum trong Swift có gì khác không nhé.

  • Enum là kiểu dữ liệu được dùng để tổ chức và gom nhóm các giá trị rời rạc thành một tập hợp. Thông thường enum hay được sử dụng như một tham số, hoặc thể hiện các trạng thái.
  • Các phần tử (giá trị) trong enum phải được liệt kê sẵn từ khi khởi tạo. Bạn không thể thêm hoặc bớt phần tử trong quá trình thực thi.

Cú pháp khai báo enum trong Swift

Để khai báo (khởi tạo) enum, bạn cần tuân thủ theo cú pháp sau:
enum trong SwiftTừ cú pháp trên, bạn có thể thấy là enum trong Swift khác với những kiểu enum truyền thống ở chỗ những phần tử bên trong enum có thể không cần gán với một giá trị nào cả.
Ví dụ: Bây giờ, chúng ta hãy thử xét ví dụ sau.
enum trong SwiftTrong ví dụ trên, mình đã khai báo một enum với tên CompassPoint. enum này có 04 giá trị con bên trong tương ứng là north, south, east, west. Ngoài ra, bạn cũng có thể khai báo rút gọn trên 01 dòng, chẳng hạn như ví dụ sau:
enum trong Swift

Sử dụng enum

Bạn sử dụng dấu “.” để truy xuất các phần tử con bên trong enum. Quá đó bạn có thể sử dụng enum bằng cách truyền giá trị con của enum cho một biến/hằng nào đó. Ví dụ như sau:
enum trong SwiftSau phép gán trên, biến directionToHead sẽ có kiểu CompassPoint và mang giá trị là west. Hoặc bạn cũng có thể gán giá trị khác cho biến directionToHead một cách đơn giản hơn như sau:
enum trong SwiftCách sử dụng enum khá đơn giản phải không nào. Mục đích tạo enum thông thường hay được sử dụng như một hằng giá trị để kiểm tra tính hợp lệ cho một biểu thức nào đó. Vì thế mà enum cũng hay được kết hợp với cấu trúc switch để chỉ định phương thức xử lý với từng giá trị cụ thể, ví dụ:
enum trong Swift


Giá trị liên hợp (Associated Values)


Trong một số trường hợp, giá trị của các phần tử con trong một enum có thể được khai báo với kiểu dữ liệu và bộ giá trị khác nhau để phù hợp cho từng mục đích riêng biệt. Cách khai báo này gọi là khai báo giá trị liên hợp (associated values).

Khai báo enum với giá trị liên hợp

Để cho dễ hiểu giá trị liên hợp là gì, mình lấy một ví dụ như sau nhé. Mã vạch và qr code là 2 loại mã hay được sử dụng để quản lý thông tin một sản phẩm nào đó.

  • Mã vạch là dạng mã hoá được tạo ra từ 04 con số nguyên.
  • Qr code lại là dạng mã hoá từ một chuỗi ký tự nào đó.

Bạn có thể thấy rằng 02 loại mã này giống nhau ở chỗ đều là dạng mã hoá, nhưng khác nhau ở giá trị mà nó lưu trữ.
Giá trị liên hợp (Associated Values) Từ phân tích trên, chúng ta có thể khai báo enum với những giá trị con thể hiện 02 loại mã như sau:
Giá trị liên hợp (Associated Values)Bạn thấy không, trong cùng một enum nhưng chúng ta có thể tổ chức các phần tử mang giá trị có kiểu khác nhau. Điều này sẽ giúp bạn đỡ phải tạo ra nhiều đối tượng khác nhau. Qua đó các thao tác của bạn sẽ nhanh và thoải mái hơn trong lập trình.

Sử dụng enum với giá trị liên hợp

Cách thức khai báo enum với giá trị liên hợp có đôi chút khác so với cách thông thường. Nhưng để sử dụng thì lại không có gì khác biệt nhiều lắm. Từ ví dụ trước, bạn có thể sử dụng enum như sau:
Giá trị liên hợp (Associated Values)Ngoài ra bạn cũng có thể sử dụng giá trị liên hợp với cấu trúc switch như sau:
Giá trị liên hợp (Associated Values)Lưu ý: Trong cấu trúc switch, nếu các tham số truyền vào cho giá trị liên hợp đều cùng là hằng số hoặc cùng là biến. Như ví dụ trên, bạn có thể thấy các tham số truyền vào đều là hằng. Thì lúc này bạn có thể viết rút gọn như thế này cũng được.
Giá trị liên hợp (Associated Values)


Giá trị đơn (Raw Values)


Trong Swift, enum cho phép bạn thiết lập giá trị mặc định cho các thành phần con bên trong. Những giá trị mặc định này chính là các giá trị đơn trong enum.

Khai báo enum với giá trị đơn

Để thiết lập giá trị mặc định cho các thành phần con, bạn cần chỉ định kiểu dữ liệu cụ thể cho enum.
Ví dụ: Bây giờ, chúng ta hãy thử xét ví dụ sau.
Giá trị đơn (Raw Values)Trong ví dụ trên, bạn có thể nhận ra ngay sự khác biệt so với cách khai báo trước. Đó là khi khai báo enum, mình đã chỉ định luôn kiểu Character. Điều này đồng nghĩa với việc các phần tử con bên trong enum có cùng kiểu Character. Do đó các phần tử con này cũng chỉ có thể nhận các giá trị là ký tự mà thôi.

Lưu ý: Với enum được thiết lập các giá trị đơn là số nguyên. Nếu bạn không thiết lập giá trị mặc định ban đầu thì hệ thống sẽ tự thiết lập theo thứ tự tăng dần (bắt đầu là 0). Ví dụ:
Giá trị đơn (Raw Values)Trong ví dụ trên, thành phần mercury được thiết lập mặc định là 1, những thành phần sau sẽ tự động được thiết lập tăng dần (như vậy venus sẽ có giá trị là 2, ). Còn nếu enum là dạng chuỗi, thì mặc định giá trị của mỗi thành phần con cũng chính là tên của mỗi thành phần đó.

Sử dụng enum với giá trị đơn

Để truy xuất giá trị mặc định của các thành phần con bên trong một enum. Chúng ta sử dụng thuộc tính rawValue, ví dụ:
Giá trị đơn (Raw Values) Bạn cũng có thể dùng phương thức khởi tạo enum để tạo một biến/hằng nhận giá trị enum tương ứng.
Giá trị đơn (Raw Values)Lưu ý: Kiểu trả về của phương thức khởi tạo này là optional, do đó possiblePlanet cũng sẽ có kiểu là optional.


Hàm trong enum


Swift trang bị cho enum khá nhiều tính năng. Enum trong Swift có khả năng khai báo hàm con bên trong. Đây là một trong những điểm khác biệt của enum so với các ngôn ngữ khác. Và đây cũng chính là nguyên nhân mà mình xem enum như là một kiểu dữ liệu có cấu trúc chứ không đơn thuần là kiểu liệt kê như các ngôn ngữ khác.

Thôi thì không gì rõ nghĩa hơn là thử làm ví dụ, mình nghĩa là với khả năng hiện tại bạn đã có thể tự hiểu được ví dụ này.
Hàm trong enumTrong ví dụ trên, mình khai báo một hàm có tên bên trong enum. Hàm này có nhiệm vụ trả về chuỗi thể hiện loại tiền tệ tương ứng với phần tử trong enum. Cũng không có gì khó hiểu phải không nào, mình tin và nhìn ví dụ trên thì bạn cũng hiểu được phần này rồi.


Tổng kết


Bài viết này là bài viết đầu tiên trong chuỗi bài viết về kiểu dữ liệu có cấu trúc. Qua bài viết này, mình đã trình bày tới bạn hầu hết những đặc điểm của enum trong Swift. Qua đó mình hy vọng rằng bạn sẽ thu hoạch được một chút gì đó về những khía cạnh mới của enum trong Swift so với các ngôn ngữ khác.

0 0 votes
Đánh giá bài viết
1 Bình luận
cũ nhất
mới nhất
Inline Feedbacks
View all comments
Lê Ngọc Sơn
Lê Ngọc Sơn
3 năm trước

Mình góp ý phần “Khai báo enum với giá trị đơn” đoạn “Lưu ý” bạn nên sử dụng hashValue để nói trực tiếp đến index của giá trị trong enum luôn. Mặc dù hashValue không hay sử dụng nhưng dù sao biết thêm 1 chút cũng ko thừa 😀