Swift—Advanced control flow

by NhatHM
708 views

Bài viết này giới thiếu cái khái niệm và các dùng về control flow trong Swift:

For loop

Countable ranges

  • countable closed range: 0…5
  • countable half-open range: let halfOpenRange = 0..<5

For in với where condition

  • Swift hỗ trợ for in where để lọc ra các điều kiện phù hợp trong tập cho trước:
var sum = 0

for i in 1...10 where i % 2 == 1 {
    sum += i
}

Continue and labeled statements

  • Trong nhiều trường hợp, khi điều kiện trong vòng loops trở nên phức tạp hơn, thì ta có thể sử dụng “labeled statements” để tiếp tục vòng loop tương ứng, ví dụ như dưới:
var sum = 0
rowLoop: for row in 0..<8 {
    columnLoop: for column in 0..<8 {
        if row == column {
            continue rowLoop
        }
        sum += row * column
        print(sum)
    }
}
  • Ở đây, rowLoop và columnLoop được gọi là “labeled statements”, ta có thể tiếp tục vòng loop tương ứng bằng câu lệnh “continue”

Switch statements

  • Không như Objective C là switch điều kiện switch (expression) chỉ có thể sử dụng các loại data dạng như int, character…, thì trong Swift, điều kiện switch đã trở nên phong phú và thuận tiện hơn rất nhiều.
  • Các điều kiện switch mà Swift support:
    • Điều kiện switch là một hoặc nhiều giá trị cùng loại data với nhau
    • Điều kiện switch có thể là range
  • Các điểm chính của Switch Statement:
    • No implicit Fallthrough (không tự động chuyển sang case tiếp theo): đối với các case điều kiện của Switch statement thì không có chuyện điều kiện switch được tự động chuyển sang case tiếp theo, nghĩa là mỗi điều kiện trong case của switch đều phải có body. Đoạn code như dưới sẽ báo lỗi khi compile. (Trong trường hợp muốn kết hợp nhiều điều kiện switch case thì sử dụng “compound case” switch.)
switch age {
case 19: // Error
case 20:
    print("adult")
default:
    print("default case")
}
  • Interval matching: switch trong Swift hỗ trợ switch case theo từng khoảng giá trị. Ví dụ:
let age = 18

switch age {
case 0..<18:
    print("child")
case 18..<60:
    print("adult")
default:
    print("old")
}
  • Tuples: Swift switch statement hỗ trợ điều kiện trong switch case là tuple, cách sử dụng cũng rất linh hoạt. Ví dụ (lấy từ swift.org):
let somePoint = (1, 1)
switch somePoint {
case (0, 0):
    print("\(somePoint) is at the origin")
case (_, 0):
    print("\(somePoint) is on the x-axis")
case (0, _):
    print("\(somePoint) is on the y-axis")
case (-2...2, -2...2):
    print("\(somePoint) is inside the box")
default:
    print("\(somePoint) is outside of the box")
}
  • Đối với trường hợp sử dụng tuple thì điều kiện trong case có thể là mapping cả tuple, hoặc chỉ 1 giá trị trong tuple mà thôi, đối với giá trị không cần so sánh thì dùng ký tự “_” (wildcard pattern) để định nghĩa.
  • Value Bindings: trong trường hợp muốn lấy giá trị của giá trị trong tuple khi đã thoả mãn điều kiện thì dùng câu lệnh như sau:
let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
    print("on the x-axis with an x value of \(x)")
case (0, let y):
    print("on the y-axis with a y value of \(y)")
case let (x, y):
    print("somewhere else at (\(x), \(y))")
}
  • -> như trong trường hợp này thì chỉ cần giá trị point thoả mãn y = 0 thì sẽ lấy được giá trị của x ra bằng câu lệnh “let x”
  • Where: where statement được dùng trong switch case để xử lý những câu switch với điều kiện phức tạp, ví dụ:
let person = ("Gaby", "Female", 18)
switch person {
case (_, _, let age) where (age > 50):
    print("This person is not in age range")
case (_, let gender, _) where (gender == "Male"):
    print("This is male employee")
case (_, let gender, _) where (gender == "Female"):
    print("This is female employee")
default:
    print("Default")
}
  • Compound case: trong trường hợp nhiều điều kiện case xử lý chung một logic thì ta có thể kết hợp các điều kiện đó vào chung 1 case switch, ví dụ:
let language = "Swift">switch language {
case "Swift", "Objective-C":
    print("Company: Apple")
case "Dart", "Go lang":
    print("Company: Google")
default:
    print("Some other companies")
}
  • Switch statement cho phép sau khi xử lý logic ở case trên, sẽ tiếp tục xử lý logic ở case dưới với keyword “fallthrough”

Control Transfer Statements

  • continue:
    • Câu lệnh continue hỗ trợ việc break ra khỏi vòng lặp hiện tại của for-loop mà không break hoàn toàn khỏi for-loop
  • break
    • Câu lệnh break trong loop statement sẽ ngắt hoàn toàn vòng lặp.
    • Câu lệnh break trong switch statement sẽ kết thúc switch statement. Bởi vì các case của switch statement không được phép empty nên thường add break vào để tránh compile error. Ví dụ add break vào default case.
  • fallthrough
    • Fallthrough cho phép switch statement sau khi thực hiện xong logic của case bất kỳ, sẽ được chuyển tiếp xuống dưới để thực hiện case tiếp theo. Thường ứng dụng trong trường hợp muốn append thêm logic vào kết quả đã được xử lý ở các case của switch statement (sẽ viết ở default case)
  • return
  • throw
    • https://docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html#ID510

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.