Switf - Tuple (Bài trước)
(Bài tiếp) Switf - String

Lệnh rẽ nhánh if trong Swift

Một cấu trúc thi hành có điều kiện nghĩa là cấu trúc đó sẽ thi hành khối lệnh tương ứng với điều kiện cụ thể nào đó. Vì dụ như nếu có lỗi (điều kiện xảy ra) thì hiện thị thông báo lỗi (khối lệnh thi hành). Lệnh rẽ nhánh if, switch là trường hợp cụ thể áp dụng cơ chế này.

Khối lệnh trong Swift

Tập hợp các câu lệnh gom lại trong dấu { ... } gọi là khối lệnh. Ví dụ:

{
    // ... các lệnh trong khối
}

Lệnh if đơn giản: nếu điều kiện đúng thì thi hành khối lệnh, cú pháp như sau

if điều_kiện {
   //Các lệnh sẽ thi hành nếu điều_kiện là đúng
}
Ví dụ
var foundFile = true;

if (foundFile) {
    print("Found file")
}

Lệnh if phức tạp, lồng nhau - thi hành cấu trúc lệnh dạng - nếu điều kiện kiểm tra là đúng thì thi hành một khối lệnh 1, nếu sai thi hành khối lệnh 2

if điều_kiện {
   //Khối lệnh 1 - thi hành nếu điều_kiện là true
} else {
   //Khối lệnh 2 - thi hành nếu điều_kiện là false
}

Có thể lồng nhau nhiều lệnh if để kiểm tra nhiều điều kiện, cấu trúc

if điều_kiện1 {
   //Khối lệnh 1 -  thi hành nếu điều_kiện1 là true
} else if điều_kiện2 {
   //Khối lệnh 2 - thi hành nếu kiều_kiện1 là false, điều_kiện2 là true
} else {
  //Khối lệnh 3  - thi hành nếu kiều_kiện2 là false, điều_kiện2 là false
}
//Số lệnh if lồng vào không giới hạn

Rẽ nhiều nhánh bằng lệnh switch / case

Lệnh này sẽ kiểm tra giá trị biểu thức, so sánh với mỗi trường hợp (case) - bằng trường hợp nào thì thi hành khối lệnh trường hợp đó. Cú pháp như sau:

switch biểu_thức {
case giá_trị_1:
    //...Code thi hành nếu biểu_thức có giá trị là: giá_trị_1
case giá_trị_2:
    //...Code thi hành nếu biểu_thức có giá trị là: giá_trị_2
default:
    //...Code thi hành nếu biểu_thức bằng giá trị nào trong các case
}

Bạn lưu ý có dấu : ở phần case, trong switch không hạn chế số lượng case. Từ khóa default: nhằm định nghĩ code mà không có case nào phù hợp, luôn để ở cuối. Không cần từ khóa break ở cuối mỗi case

var wday = "Mon";
switch wday {
case "Mon":
  print("Thứ 2")
case "Tue":
    print("Thứ 3")
default:
    print("Không biết")
}

Kiệm tra điều kiện phức tạp với where

Ví dụ bạn sử dụng Tuple, để truyền nhiều giá trị trong biểu thức của switch, nếu muốn kiểm tra các giá trị đó - tùy thuộc vào các giá trị này mà có các case khác nhau, để làm điều này có thể tham khảo đoạn code kết hợp switch với kiểm tra điều kiện where như sau:

//Khai báo một Tuple hai giá trị
var myNumbers = (10, 20)
switch myNumbers {
case let (x, y) where x > y:
    print("Số hạng 1 lớn hơn số hạng 2")
case let (x, y) where x < y:
    print("Số hạng 1 nhỏ hơn số hạng 2")
case let (x,y):
    print("Hai số bằng nhau")
}

Trong ví dụ trên, case khởi tạo hằng tạm thời tên x, y - giá trị khởi tạo cho nó là từ giá trị phần tử Tuple myNumbers, sau để điều kiện kiểm tra viết sau từ khóa where, nếu biểu thức sau where là true thì thi hành case này

Vòng lặp while và repeat trong Swift

while

Vòng lặp while: kiểm tra điều_kiện, nếu đúng chạy khối lệnh của while - nếu sai bỏ qua. Sau mỗi lần chạy kiểm tra lại điều kiện, nếu đúng chạy tiếp. Cú pháp như sau:

while điều_kiện {
    //Lệnh chạy
}
var month = 1;
while month <= 12 {
    print("Tháng ", month)
    month+=1
}
//In ra Tháng 1 ... Tháng 12
repeat

Lệnh while trên kiểm tra điều kiện logic trước rồi chạy khối lệnh, nhưng nếu muốn khối lệnh được chạy ít nhất một lần, sau đó mới kiểm tra điều kiện, nếu đúng bắt đầu vòng lặp mới: vậy sẽ dùng repeat ... while với cú pháp như sau

repeat {
    //Các lệnh trong vòng lặp
} while (điều_kiện_lặp_lại)
Ví dụ:
var month2 = 1;
repeat {
    print("Tháng ", month2)
    month2+=1
} while (month2 <= 12)

Các lệnh lặp trên khi dùng phải cận thận - đảm bảo một thời điều nào đó điều kiện logic kiểm tra lặp lại là sai để thoát vòng lặp, nếu không đó là vòng lặp vô hạn. Lặp với repeat khi khối lệnh bao giờ cũng được thi hành ít nhất một lần.

Vòng lặp for .. in

Nếu muốn lặp bằng cách duyệt (đếm) qua mối dải số, các phần tử trong mảng, các ký tự trong chuỗi thì sẽ dùng đến cấu trúc lặp for .. in ..

Hãy xem một số ví dụ từ doc Swift sau:

Duyệt qua một dải số

//Biến i nhận lần lượt các giá trị từ dãy số 1,2, .. 5
for i in 1...5 {
    print("\(i) nhân 5 là \(i * 5)")
}
// 1 nhân 5 là 5
// 2 nhân 5 là 10
// 3 nhân 5 là 15
// 4 nhân 5 là 20
// 5 nhân 5 là 25

Duyệt qua các phần tử của mảng

//Khai bảo một mảng tên các môn học
let subjects = ["Java", "PHP", "C++", "Swift"]

//Duyệt qua từng môn học trong mảng
for subject in subjects {
    print("Môn học \(subject)!")
}
//Môn học Java!
//Môn học PHP!
//Môn học C++!
//Môn học Swift!

Duyệt qua mảng có cấu trúc dạng dictionary (từ điển). Mảng này có lưu mỗi phần tử theo cặp name:value

let hinhchunhat = ["Chiều dài":300, "Chiều rộng": 200]
for (kichthuoc, giatri) in hinhchunhat {
    print("\(kichthuoc) là \(giatri)")
}
//Chiều dài là 300
//Chiều rộng là 200

Điều hướng vòng lặp với continue

Trong vòng lặp khi gặp continue thì sẽ không thi hành các dòng code phia dưới continue mà ngay lập tức chuyển đến lượt lặp tiếp theo. Ví dụ: in ra các số lẻ trong khoảng 1 đến 100.

for i in 1...100 {
    if (i%2 == 0) {
        continue; //lặp lại luôn do i là chẵn
    }
    print(i)
}

Điều hướng break

Khi gặp break khối lệnh bị thoát ngay lập tức. Nó hay sử dụng trong vòng lặp for, while để thoát ngay lập tức quá trình lặp.

for i in 1...100000 {
    if (i == 5) {
        continue    //Khởi tạo vòng lặp mới luôn
    }
    print(i);
    if (i >= 7) {
        break        //Thoát lặp nếu i >=7
    }
}
//In ra các số: (bỏ qua 5)
0
1
2
3
4
6
7

Trong câu lệnh switch thì break luôn được dùng với default để cho biết kết thucs switch khi không có case nào phù hợp:

var W = "Mon"
switch W {
case "Mon":
    print("Thứ 2")
case "Tue":
    print("Thứ 3")
default:
    break
}

Điều hướng fallthrough

Trong câu lệnh rẽ nhánh switch, thì khi khối lệnh phù hợp được thi hành, nghĩa là case nào phù hợp thì thi hành các lệnh trong case đó và bỏ qua các case phía dưới. Điều này khác với swich trong PHP, C++ ... khi mà các case phía dưới vẫn được thi hành cho đến khi gặp break.

Nếu muốn switch ở Swift cũng ứng xử như vậy, thì cuối case cần thêm khóa fallthrough

let sokiemtra = 5
var dienta = "Số \(sokiemtra) là"
switch sokiemtra {
case 2, 3, 5, 7, 11, 13, 17, 19:
    dienta += " số nguyên tố, và cũng là"
    //Chỉ thị các case phía sau được chạy
    fallthrough
default:
    dienta += " số nguyên."
}
print(dienta)
//In ra: Số 5 là số nguyên tố, và cũng là số nguyên.

Đăng ký nhận bài viết mới
Switf - Tuple (Bài trước)
(Bài tiếp) Switf - String