Cấu trúc điều kiện là một trong những cấu trúc cơ bản nhưng cũng rất quan trọng. Và Swift hỗ trợ đầy đủ tất cả các cấu trúc điều kiện như các ngôn ngữ khác. Mình nghĩ rằng khi tìm hiểu Swift thì chắc các bạn đã biết ít nhất một ngôn ngữ nào đó. Ví dụ như C, vì vậy có thể các bạn đã biết qua về cấu trúc điều kiện chẳng hạn như cấu trúc if. Vì thế trước khi tìm hiểu các cấu trúc rẽ nhánh trong Swift, mình muốn giới thiệu một vài quy tắc chung trong Swift để các bạn dễ hình dung so với ngôn ngữ khác.
- Không cần đặt các điều kiện bên trong cặp dấu ngoặc “(” “)“.
- Khối lệnh trong thân luôn phải đặt trong cặp dấu nhọn “{ ” “}” cho dù chỉ có 1 lệnh. Hơi bất tiện hơn so với C nhỉ.
Bên cạnh đó nó còn có những cải tiến cũng khá thú vị, các bạn theo dõi nhé.
Cấu trúc if
Nói đến cấu trúc điều kiện thì không thể không nhắc tới cấu trúc if. Đây là cấu trúc thông dụng mà hầu hết các ngôn ngữ lập trình nào cũng có. Cấu trúc if hiểu đơn giản là để kiểm tra tính hợp lệ của biểu thức điều kiện nào đó. Cú pháp của cấu trúc if như sau:
Các bạn nhìn cú pháp ở trên có thấy rằng nó cũng tương tự như C không nào? Ý nghĩa của nó là, nếu biểu thức điều kiện đúng thì sẽ thực thi khối lệnh bên trong. Mình lưu ý lại là cấu trúc if này không cần cặp dấu ngoặc “(” “)” cho biểu thức điều kiện nhé. Để nắm rõ hơn, các bạn xem thử ví dụ như sau:
Ví dụ trên hiểu đơn giản thế này. Khai báo hằng số nguyên x với giá trị là 10, sau đó dùng cấu trúc if để kiểm tra. Nếu giá trị của x lớn hơn 9 thì in kết luận ra màn hình. Các bạn cũng cần nhớ là dù chỉ có 01 lệnh nhưng vẫn phải đặt trong cặp dấu “{ ” “}” nhé. Ví dụ này hơi đơn giản, bạn nên tự thực nghiệm thêm để hiểu rõ hơn về cấu trúc if.
Cấu trúc if…else
Cấu trúc if ở trên sẽ rất phù hợp trong trường hợp chúng ta chỉ quan tâm tới việc xử lý trường hợp đúng. Vậy thì trường hợp sai thì sao nhỉ? Lúc này, chúng ta sẽ mở rộng cấu trúc if ra bằng khối lệnh else, cú pháp như sau:
Ý nghĩa cú pháp trên như sau: “Nếu biểu thức điều kiện đúng thì thực hiện khối lệnh 1, ngược lại thực hiện khối lệnh 2″. Các bạn thấy đó, với cấu trúc if hay if…else thì các bạn nên biện luận theo mệnh đề “nếu…thì…ngược lại” thì sẽ rất dễ hiểu phải không. Để nắm rõ hơn, chúng ta xét ví dụ sau nhé:
Tới đây thì mình tin rằng bạn đã có thể đọc hiểu được ví dụ trên phải không nào. Ở đây mình thử khai báo một biến Optional và kiểm tra: “Nếu biến a bằng nil thì in “a rỗng” ngược lại in giá trị của a ra màn hình”.
Tới đây vẫn chưa xong đâu các bạn nhé? Bởi vì vẫn còn trường hợp cần phải xử lý tiếp. Đó là trường hợp ngược lại mình cũng muốn kiểm tra một điều kiện gì đó thì sao? Có thể là các bạn sẽ biện luận rằng, thêm cấu trúc if bên trong khối lệnh của else. Điều đó đúng, nhưng không hay. Bởi vì các bạn sẽ mất công khai báo thêm cấu trúc, rồi thêm một mớ dấu ngoặc “{ ” “}” nữa. Nếu các bạn siêng thì không sao, cứ làm như vậy. Nhưng Swift lại cung cấp cho chúng ta một cơ chế lồng như sau:
Cấu trúc if … else if … else
Với cú pháp trên, chúng ta đã có thể kiểm tra lồng cấp nhiều trường hợp trong một cấu trúc. Nếu biểu thức điều kiện 1 đúng thì thực hiện khối lệnh 1, ngược lại nếu biểu thức điều kiện 2 đúng thì thực hiện khối lênh 2,…, ngược lại thực hiện khối lệnh sai sau cùng. Với cấu trúc này thì việc kiểm tra các biểu thức điều kiện trở nên thoải mái hơn rồi. Phần này các bạn tự ví dụ thực nghiệm thử nhé.
Cấu trúc guard … else
Tiếp tục trong nội dung của cấu trúc if, mình sẽ trình bày thêm một cấu trúc nữa nhé. Đó là cấu trúc guard, đây là cấu trúc rẽ nhánh mới mà Swift cung cấp cho chúng ta.
Để dễ hiểu hơn, mình xét thử ví dụ sau:
Với ví dụ trên, các bạn có thể hiểu như sau:
- Nếu y khác nil thì gán y cho x, ngược lại nếu y bằng nil thì mới thực hiện khối lệnh.
- Cấu trúc guard luôn đi kèm else.
- Lưu ý: đây là phép gán không phải phép so sánh nên biểu thức trên guard là = chứ không phải ==
Nhận xét cấu trúc điều kiện if
Mình hy vọng rằng các bạn đã nắm được cách thức để sử dụng cấu trúc điều kiện if. Đây là một cấu trúc đơn giản nhưng không kém phần quan trọng. Trong lập trình không thể thiếu if được, nếu còn chỗ nào chưa hiểu thì các bạn cứ đặt câu hỏi bằng comment bên dưới nhé. Thực ra thì các bạn cũng đã được tiếp xúc tới một dạng ngắn hơn của if. Nếu quên thì các bạn xem lại toán tử điều kiện trong bài 5 nhé.
Tiếp theo, mình sẽ trình bày thêm cho các bạn một cấu trúc rẽ nhánh nữa. Đó là cấu trúc switch … case, đây là một cấu trúc cũng khá hay. Hy vọng đọc đến đây các bạn vẫn chưa mệt .
Cấu trúc switch … case
Đôi khi chúng ta cần thực hiện việc kiểm tra so khớp một biến/hằng nào đó. Nói đến đây thì chắc hẳn các bạn sẽ nghĩ đến việc dùng cấu trúc if phải không nào? Điều này không sai, vì bản chất của if là để kiểm tra cơ mà. Thế nhưng sẽ không có gì đáng nói nếu như việc kiểm tra này lại cần được so khớp với nhiều giá trị. Rõ ràng rằng chúng ta vẫn có thể dùng if lồng để so sánh, nhưng việc này cũng sẽ khiến source code của chúng ta trở nên dài dòng và rườm rà hơn nhiều.
Lúc này, cấu trúc switch được sử dụng để thay thế if trong trường hợp cần so sánh một giá trị nào đó với nhiều giá trị khác nhau. Cú pháp của cấu trúc switch như sau:
Để hiểu rõ hơn, chúng ta xét ví dụ sau:
Ví dụ trên, chúng ta có thể thấy cấu trúc switch có một số cải tiến hơn so với các ngôn ngữ khác:
- Mỗi một case có thể chứa nhiều giá trị để thực hiện so khớp.
- Không cần lệnh break bên trong mỗi khối lệnh của case. Sau khi thực thi khối lệnh của case, Swift sẽ tự ngừng và thoát ra khỏi cấu trúc. Nếu muốn các bạn vẫn có thể chèn thêm break.
- Khác với C, mỗi một case bắt buộc phải có ít nhất 01 lệnh bên trong.
- Hỗ trợ toán tử phạm vị để so khớp với một dãy các giá trị.
- Mỗi case cũng có thể là một bộ giá trị tuple thay vì một giá trị như thông thường.
- Được bổ xung thêm mệnh đề where để tăng khả năng truy vấn.
Mệnh đề where
Đây là cải tiến mới và cũng rất hay trong ngôn ngữ Swift. Mệnh đề where được sử dụng trong một số trường hợp cần bổ xung thêm việc kiểm tra tính hợp lệ của một case nào đó mà không cần sử dụng thêm cấu trúc if.
Xét ví dụ sau:
Từ ví dụ trên các bạn đã nhận thấy được điều gì chưa nhỉ? Ở đây mình có một biến temperature có giá trị là 54. Các bạn có thể thấy rằng temperature khớp với case 50…79, nhưng như vậy vẫn chưa đủ. Trong trường hợp này còn có thêm mệnh đề where để giúp chúng ta sàng lọc. Cụ thể là biến temperature đồng thời còn phải thoả mãn điều kiện là số chẵn nữa thì mới được thực thi câu lệnh bên dưới.
Lệnh fallthrough
Lệnh này không có trong Java hay C#. Như đã nói ở trên, mỗi khi thực hiện xong một khối lệnh của case nào đó thì switch sẽ tự động dừng mà không cần lệnh break. Thế nhưng nếu có một trường hợp nào đó mà chúng ta lại không muốn dừng thì sao nhỉ?
Swift bổ xung lệnh fallthrough nhằm giúp hệ thống có khả năng tự tiếp tục thực thi khối lệnh case (hoặc khối lệnh default) kế tiếp (tương tự C# nếu khuyết break).
Chúng ta xét ví dụ sau:
Sau khi thực thi, chúng ta sẽ nhận được kết quả là 2 dòng sau:
Hot and even
Rõ ràng fallthrough giúp chúng ta thực hiện tiếp tục khối lệnh bên dưới mà không cần kiểm tra điều kiện. Tới đây các bạn đã hiểu ra vấn đề chưa nhỉ?
Tổng kết
Phần này mình đã trình bày cho các bạn những kiến thức về cấu trúc điều kiện trong Swift. Đây là những cấu trúc cơ bản trong lập trình Swift nhưng cũng đóng vai trò rất quan trọng vì các bạn sẽ thường hay sử dụng nó nhưng cũng không khó đúng không nào. Mặc dù vậy nếu có gì khó hiểu, các bạn vui lòng comment bên dưới nhé. Trong khả năng có thể mình sẽ cố gắng giải đáp cho các bạn.
Bài viết rất tuyệt. Thanks Nam Trung !