Swift cung cấp một loạt các kiểm soát dòng các câu lệnh.Chúng bao gồm các vòng lặp while để thực hiện một nhiệm vụ nhiều lần; ifguard, and switch câu lệnh để thực thi các nhánh mã khác nhau dựa trên các điều kiện nhất định; và các tuyên bố như break and continue để chuyển luồng thực thi đến một điểm khác trong mã của bạn.

Swift cũng cung cấp một vòng lặpfor-in giúp dễ dàng lặp lại qua các mảng, từ điển, phạm vi, chuỗi và các trình tự khác.

Swift’s switch tuyên bố mạnh hơn đáng kể so với đối tác của nó trong nhiều ngôn ngữ giống như C. Các trường hợp có thể phù hợp với nhiều mẫu khác nhau, bao gồm các khoảng thời gian khớp, bộ dữ liệu và chuyển thành một loại cụ thể.Các giá trị khớp trong trường hợp chuyển đổi có thể được liên kết với các hằng hoặc biến tạm thời để sử dụng trong thân trường hợp và các điều kiện khớp phức tạp có thể được biểu thị bằng mệnh đề where cho mỗi trường hợp.

Vòng lặp For-In

 

bạn sử dụng vòng lặp for-in để lặp qua một chuỗi, chẳng hạn các mục trong một mảng, phạm vi số hoặc ký tự trong một chuỗi.

Ví dụ này sử dụng vòng lặp for-in để lặp lại các mục trong một mảng:

 

let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
    print("Hello, \(name)!")
}
// Hello, Anna!
// Hello, Alex!
// Hello, Brian!
// Hello, Jack!

Bạn cũng có thể lặp lại từ điển để truy cập các cặp key-value của nó. Mỗi mục trong từ điển được trả về dưới dạng một khóa (key, value) khi từ điển được lặp lại, và bạn có thể phân tách các thành viên (key, value) tuple thành các hằng số được đặt tên rõ ràng để sử dụng trong phòng thân của vòng lặp for-in. Trong ví dụ mã dưới đây, các khóa từ điển được phân tách thành một hằng số được gọi là animalName, và các giá trị từ điển được phân tách thành một hằng số được gọi là legCount.

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    print("\(animalName)s have \(legCount) legs")
}
// ants have 6 legs
// cats have 4 legs
// spiders have 8 legs

Nội dung của từ điển vốn không có thứ tự, và lặp đi lặp lại trên chúng không đảm bảo thứ tự mà chúng ta được lấy. Cụ thể thứ tự bạn chèn các mục vào từ điển sẽ không xác định thứ tự chúng được lặp. Để biết thêm về mảng và từ điển, xem  Collection Types.

Bạn cũng có thể sử dụng các vòng lặp for-in với phạm vi số. Ví dụ dưới in một vài mục đầu tiên trong bảng năm lần:

for index in 1...5 {
    print("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25

Chuỗi được lặp lại là một dãy các số từ 1 đến 5, bao gồm, như được chỉ định bởi việc sử dụng toán tử phạm vi khép kín(...). Giá trị của chỉ mục được đặt thành số đầu tiên trong phạm vi (1), và các câu lệnh bên trong vòng lặp được thực thi. Trong trường hợp này, vòng lặp chỉ chứa một câu lệnh, trong đó in một mục từ bảng năm lần cho giá trị hiện tại của chỉ mục. Sau khi câu lệnh được thực thi, giá trị của chỉ mục được cập nhật để chứa giá trị thứ hai trong phạm vi (2), và bản in(_:separator:terminator:) chức năng được gọi lại. quá trình này được tiếp tục cho đến khi kết thúc phạm vi đạt được.

Trong ví dụ trên, index là một hằng số có giá trị được đặt tự động khi bắt đầu mỗi lần lặp của vòng lặp. Như vậy, index không phải khai báo trước khi sử dụng. Nó được khai báo hoàn toàn đơn giản bằng cách đưa nó vào khai báo vòng lặp, mà không cần từ khóa khai báo.

Nếu bạn không cần một giá trị từ một chuỗi, bạn có thể bỏ qua các giá trị bằng cách sử dụng dấu gạch dưới thay cho tên biến.

let base = 3
let power = 10
var answer = 1
for _ in 1...power {
    answer *= base
}
print("\(base) to the power of \(power) is \(answer)")
// Prints "3 to the power of 10 is 59049"

Ví dụ trên tính toán giá trị của một số với lũy thừa của số khác (trong trường hợp này là 3 cho lũy thừa 10). Nó nhân giá trị bắt đầu bằng 1 (nghĩa là 3 với sức mạnh của 0) với 3, mười lần,sử dụng phạm vi khép kín bắt đầu bằng 1 và kết thúc bằng 10. Đối với tính toán này, các giá trị bộ đếm riêng lẻ mỗi lần qua vòng lặp là không cần thiết—Mã đơn giản chỉ thực hiện vòng lặp số lần chính xác. Ký tự gạch dưới (_)được sử dụng thay cho biến vòng lặp làm cho các giá trị riêng lẻ bị bỏ qua và không cung cấp quyền truy cập vào giá trị hiện tại trong mỗi lần lặp của vòng lặp.

Trong một số trường hợp, bạn có thể không muốn sử dụng phạm vi đóng, bao gồm cả hai điểm cuối. Cân nhắc vẽ các dấu tick cho mỗi phút trên mặt đồng hồ. Bạn muốn vẽ 60 điểm đánh dấu, bắt đầu với 0 phút. Sử dụng toán tử phạm vi nửa mở (.. <) để bao gồm giới hạn dưới nhưng không giới hạn trên. Để biết thêm về phạm vi, xem Range Operators.

let minutes = 60
for tickMark in 0..<minutes {
    // render the tick mark each minute (60 times)
}

Một số người dùng có thể muốn có ít dấu tick hơn trong giao diện người dùng của họ. Họ có thể thích một điểm cứ sau 5 phút. sử dụng stride(from:to:by:) chức năng bỏ qua các dấu hiệu không mong muốn.

let minuteInterval = 5
for tickMark in stride(from: 0, to: minutes, by: minuteInterval) {
    // render the tick mark every 5 minutes (0, 5, 10, 15 ... 45, 50, 55)
}

Phạm vi kín cũng có sẵn, bằng cách sử dụng stride(from:through:by:) thay thế:

let hours = 12
let hourInterval = 3
for tickMark in stride(from: 3, through: hours, by: hourInterval) {
    // render the tick mark every 3 hours (3, 6, 9, 12)
}

Vòng lặp While 

Một vòng lặp while thực hiện một tập hợp các câu lệnh cho đến khi một điều kiện trở thành false. Các loại vòng lặp này được sử dụng tốt nhất khi số lần lặp không được biết trước khi lần lặp đầu tiên bắt đầu. Swift cung cấp hai loại vòng lặp while:

  • while đánh giá tình trạng của nó khi bắt đầu mỗi lần đi qua vòng lặp.
  • repeat-while đánh giá tình trạng của nó ở cuối mỗi lần đi qua vòng lặp.

While

Một vòng lặp while bắt đầu bằng cách đánh giá một điều kiện duy nhất. Nếu điều kiện là true, một tập hợp các câu lệnh được lặp lại cho đến khi điều kiện trở thành false.
 
Ở đây, hình thức chung của vòng lặp while:
 
while condition {
    statements
}

Ví dụ này chơi một trò chơi đơn giản của Rắn và Thang (còn được gọi là Chutes và Thang):../_images/snakesAndLadders_2x.png

Các quy tắc của trò chơi như sau:

  • Bảng có 25 ô vuông, và mục đích là hạ cánh trên hoặc ngoài ô vuông 25.
  • Quảng trường bắt đầu của người chơi là Quảng trường số 0 không vuông, nằm ngay góc dưới bên trái của bảng.
  • Mỗi lượt, bạn tung một con xúc xắc sáu mặt và di chuyển theo số ô vuông đó, theo con đường nằm ngang được chỉ định bởi mũi tên chấm ở trên.
  • Nếu lượt của bạn kết thúc ở dưới cùng của một cái thang, bạn di chuyển lên cái thang đó.
  • Nếu lượt của bạn kết thúc ở đầu của một con rắn, bạn di chuyển xuống con rắn đó.

Bảng trò chơi được đại diện bởi một loạt các giá trị Int.Kích thước của nó dựa trên một hằng số được gọi là FinalSapes, được sử dụng để khởi tạo mảng và cũng để kiểm tra điều kiện thắng sau này trong ví dụ.Bởi vì người chơi bắt đầu rời khỏi bảng, trên Quảng trường số 0, nên bảng được khởi tạo với 26 giá trị Int, không phải 25.

let finalSquare = 25
var board = [Int](repeating: 0, count: finalSquare + 1)

Một số hình vuông sau đó được thiết lập để có giá trị cụ thể hơn cho rắn và thang. Hình vuông có đế thang có số dương để di chuyển bạn lên bảng, trong khi các ô vuông có đầu rắn có số âm để di chuyển bạn xuống bảng.

board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08

Hình vuông 3 chứa đáy của thang di chuyển bạn lên hình vuông 11. Để thể hiện điều này, bảng [03] bằng +08, tương đương với giá trị nguyên là 8 (chênh lệch giữa 3 và 11). 

Để căn chỉnh các giá trị và câu lệnh, toán tử cộng đơn (+ i) được sử dụng rõ ràng với toán tử trừ đơn nguyên (-i) và các số thấp hơn 10 được đệm bằng số không. (Không phải kỹ thuật tạo kiểu là hoàn toàn cần thiết, nhưng chúng dẫn đến mã gọn gàng hơn.)
 
var square = 0
var diceRoll = 0
while square < finalSquare {
    // roll the dice
    diceRoll += 1
    if diceRoll == 7 { diceRoll = 1 }
    // move by the rolled amount
    square += diceRoll
    if square < board.count {
        // if we're still on the board, move up or down for a snake or a ladder
        square += board[square]
    }
}
print("Game over!")

Ví dụ trên sử dụng một cách tiếp cận rất đơn giản để gieo xúc xắc. Thay vì tạo một số ngẫu nhiên, nó bắt đầu với giá trị diceRoll bằng 0. 

Mỗi lần qua vòng lặp while, diceRoll được tăng thêm một và sau đó được kiểm tra xem liệu nó có trở nên quá lớn không. Bất cứ khi nào giá trị trả về này bằng 7, cuộn súc sắc đã trở nên quá lớn và được đặt lại thành giá trị 1. 
Kết quả là một chuỗi các giá trị diceRoll luôn luôn là 1, 2, 3, 4, 5, 6, 1, 2, v.v.
 
Sau khi tung xúc xắc, người chơi di chuyển về phía trước bằng các ô vuông diceRoll. Có thể rằng cuộn xúc xắc có thể đã di chuyển người chơi vượt ra khỏi ô vuông 25, trong trường hợp trò chơi kết thúc. Để đối phó với kịch bản này, mã kiểm tra hình vuông đó nhỏ hơn thuộc tính đếm mảng của bảng. Nếu hình vuông là hợp lệ, giá trị được lưu trong bảng [hình vuông] sẽ được thêm vào giá trị hình vuông hiện tại để di chuyển người chơi lên hoặc xuống bất kỳ thang hoặc rắn nào.
NOTE
Nếu kiểm tra này không được thực hiện, board[square]  có thể cố gắng truy cập một giá trị bên ngoài giới hạn của mảng bảng, điều này sẽ gây ra lỗi thời gian chạy.

Việc thực hiện vòng lặp while hiện tại sau đó kết thúc và điều kiện Vòng lặp được kiểm tra để xem liệu vòng lặp có được thực hiện lại không. Nếu người chơi đã di chuyển trên hoặc vượt quá số vuông 25, điều kiện Vòng lặp đánh giá là false và trò chơi kết thúc.

Một vòng lặp while là thích hợp trong trường hợp này, bởi vì độ dài của trò chơi không rõ ràng khi bắt đầu vòng lặp while. Thay vào đó, vòng lặp được thực thi cho đến khi một điều kiện cụ thể được thỏa mãn.

Repeat-While

Biến thể khác của vòng lặp while, được gọi là vòng lặp while, thực hiện một lần chuyển qua khối vòng lặp trước, trước khi xem xét điều kiện Vòng lặp. Sau đó nó tiếp tục lặp lại vòng lặp cho đến khi điều kiện false.

NOTE

Vòng lặp repeat-while trong Swift tương tự như vòng lặp do-while trong các ngôn ngữ khác.

Ở đây, hình thức chung của vòng lặp repeat-while :

 

repeat {
    statements
} while condition

Ở đây, ví dụ về các con rắn và thang một lần nữa, được viết dưới dạng vòng lặp repeat-while thay vì vòng lặp while. các giá trị của finalSquare, board, square, and diceRoll được khởi tạo theo cách chính xác giống như với một vòng lặp while.

let finalSquare = 25
var board = [Int](repeating: 0, count: finalSquare + 1)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0

 

Trong phiên bản này của trò chơi, hành động đầu tiên trong vòng lặp là kiểm tra thang hoặc con rắn. Krên hông có thang trên bảng đưa người chơi thẳng đến ô vuông 25, và do đó, không thể dành chiến thắng trong trò chơi bằng cách di chuyển lên một bậc thang. Do đó, nó rất an toàn để kiểm tra rắn hoặc thang là hành động đầu tiên trong vòng lặp.
 
Khi bắt đầu trò chơi, người chơi đang ở trên ô vuông không có hình vuông. board[0] luôn bằng không và không có hiệu lực.
repeat {
    // move up or down for a snake or ladder
    square += board[square]
    // roll the dice
    diceRoll += 1
    if diceRoll == 7 { diceRoll = 1 }
    // move by the rolled amount
    square += diceRoll
} while square < finalSquare
print("Game over!")

Sau khi mã kiểm tra rắn và thang, xúc xắc được cuộn và người chơi được di chuyển về phía trước bởi các ô vuông diceRoll. Việc thực hiện vòng lặp hiện tại sau đó kết thúc.

Điều kiện  (while square < finalSquare) vòng lặp vẫn gióng như trước, nhưng lần này, nó không được đánh giá cho đến khi kêt thúc lần chạy đầu tiên qua vòng lặp. cấu trúc của vòng lặp repeat-while phù hợp với trò chơi này hơn vòng lặp while trong ví dụ trước. Trong vòng lặp repeat-while ở trên, square += board[square] luôn được thực hiện ngay sau vòng lặp trong khi điều kiện xác nhận rằng hình vuông vẫn còn trên bẳng. Hành vi này loại bỏ sự cần thiết của kiểm tra giới hạn mảng được thấy trong phiên bản vòng lặp while của trò chơi được mô tả trước đó.

Conditional Statements ( câu điều kiện)

 
 
Nó thường hữu ích để thực thi các đoạn mã khác nhau dựa trên các điều kiện nhất định. Bạn có thể muốn chạy thêm một đoạn mã khi xảy ra lỗi hoặc hiển thị thông báo khi giá trị trở nên quá cao hoặc quá thấp. Để làm điều này các của phần mã của bạn có điều kiện.
Swift cung cấp hai cách để thêm các nhánh có điều kiện vào mã của bạn: câu lệnh if và câu lệnh swift. Thông thường bạn sử dụng câu lệnh if để đánh giá các điều kiện đơn giản chỉ với một vài kết quả có thể xảy ra. Câu lệnh chuyển đổi phù hợp hơn với nhiều hoán vị có thể có và rất hữu ích trong các tình huông trong đó khớp mẫu có thể giúp chọn một nhánh mã thích hợp để thực thi.

If

Ở dạng đơn giản nhất, câu lệnh if có một điều kiện if duy nhất. Nó thực thi một tập hợp các câu lệnh chỉ khi điều kiện đó là đúng.

var temperatureInFahrenheit = 30
if temperatureInFahrenheit <= 32 {
    print("It's very cold. Consider wearing a scarf.")
}
// Prints "Trời rất lạnh. Cân nhắc việc quàng khăn."

 

Ví dụ ở trên kiểm tra xem nhiệt độ nhỏ hơn hoặc bằng 32 độ F ( điểm đóng băng của nước). Nếu có một tin nhắn được in. Mặt khác không có thông báo nào được in và quá trình thực thi mã tiếp tục sau dấu ngoặc kép câu lệnh if.
Câu lệnh if có thể cung cấp một tập hợp các câu lệnh thay thế, được gọi là mệnh đề khác, cho các điều kieenhjnj khi mệnh đề if sai. Những lệnh này được chỉ định bởi từ khóa else.
Bạn có thể xâu chuỗi nhiều câu lệnh với nhau để xem xét các mệnh đề bổ sung.
temperatureInFahrenheit = 90
if temperatureInFahrenheit <= 32 {
    print("It's very cold. Consider wearing a scarf.")
} else if temperatureInFahrenheit >= 86 {
    print("It's really warm. Don't forget to wear sunscreen.")
} else {
    print("It's not that cold. Wear a t-shirt.")
}
// Prints "It's really warm. Don't forget to wear sunscreen."

 

Ở đây, một câu lệnh if bổ sung đã được thêm vào để đáp ứng với nhiệt độ đặc biệt ấm áp. Sau đó else mệnh đề còn lại, và nó in một phản ứng cho bất kỳ nhiệt độ không quá ấm cũng không quá lạnh. 
Mệnh đề else cuối cùng là tùy chọn, tuy nhiên, và có thể được loại trừ nếu tập hợp các điều kiện không cần phải hoàn thành.
temperatureInFahrenheit = 72
if temperatureInFahrenheit <= 32 {
    print("It's very cold. Consider wearing a scarf.")
} else if temperatureInFahrenheit >= 86 {
    print("It's really warm. Don't forget to wear sunscreen.")
}

Bởi vì nhiệt độ không quá lạnh cũng không quá ấm để kích hoạt if or else , hoặc nếu điều kiện khác không có thông báo nào được in.

Switch

 
Một câu lệnh chuyển đổi xem xét một giá trị và so sánh nó với một số mẫu có thể phù hợp. Sau đó, nó thực thi một khối mã thích hợp dựa trên mẫu đầu tiên khớp thành công. Một câu lệnh chuyển đổi cung cấp một thay thế cho câu lệnh if để đáp ứng với nhiều trạng thái tiềm năng.
 

Ở dạng đơn giản nhất, một câu lệnh chuyển đổi so sánh một giá trị với một hoặc nhiều giá trị cùng loại.

switch some value to consider {
case value 1:
    respond to value 1
case value 2,
     value 3:
    respond to value 2 or 3
default:
    otherwise, do something else
}

 

Mỗi câu lệnh chuyển đổi bao gồm nhiều trường hợp có thể, mỗi trường hợp bắt đầu bằng từ khóa case. Ngooaif việc so sánh với các giá trị cụ thể, Swift cung cấp một số cách cho từng case để chỉ định các mẫu phù hợp phức tạp hơn. Các tùy chọn này được mô tả sau trong chương này.
 
Giống như phần thân của một câu lệnh if, mỗi trường hợp là một nhánh thực thi mã riêng biệt. Câu lệnh Swift xác định nhánh nào sẽ được chọn. Thủ tục được gọi là chuyển đổi trên giá trị đang được xem xét.
 
Mỗi tuyên bố chuyển đổi phải được đầy đủ. Nghĩa là, mọi giá trị có thể có thể có của loại đang được xem xét phải được khớp với một trong các trường hợp chuyển đổi. Nếu nó không phù hợp để cung cấp trường hợp cho mọi giá trị có thể, bạn có thể xác định trường hợp mặc định để bao gồm bất kỳ giá trị nào không được xử lý rõ ràng. Trường hợp mặc định này đwocj chỉ định bởi từ khóa mặc định và phải luôn xuất hiện sau cùng.
 
Ví dụ này sử dụng câu lệnh chuyển đổi để xem xét một ký tự chữ thường được gọi là someCharacter:
 
let someCharacter: Character = "z"
switch someCharacter {
case "a":
    print("The first letter of the alphabet")
case "z":
    print("The last letter of the alphabet")
default:
    print("Some other character")
}
// Prints "The last letter of the alphabet"

Câu lệnh case đầu tiên phù hợp với chữ cái đầu tiên của bảng chữ cái tiếng anh, a và case thứ hai của nó khớp với chữ cái cuối cùng, z. Bởi vì công tắc phải có vỏ cho ký tự có thể, không chỉ mỗi ký tự chữ cái, câu lệnh chuyển đổi này sử dụng một default để khớp với tất cả các ký tự khác với a và z. Quy định này đảm bảo rằng các tuyên bố chuyển đổi là đầy đủ.

 

No Implicit Fallthrough

Ngược lại với các câu lệnh chuyển đổi trong C và Objective-C, các câu lệnh chuyển đổi trong swift không rơi vào cuối mỗi case và vào cái tiếp theo defalut. Thay vào đó, toàn bộ câu lệnh chuyển đổi kết thúc việc thực hiện ngay khi case chuyển đổi khớp đầu tiên được hoàn thành, mà không yêu cầu một câu lệnh breck rõ ràng. Điều này làm cho câu lệnh chuyển đổi an toàn và dễ sử dụng hơn câu lệnh trong C và tránh thực hiện nhiều hơn một case chuyển đổi do nhầm lẫn.

NOTE

mặc dù break không yêu cầu trong swift, bạn có thể sử dụng câu lệnh break để khớp và bỏ qua case cụ thể và thoát ra khỏi case khớp trước khi case đó hoàn thành việc thực thi. Để biết thêm chi tiết, xem Break in a Switch Statement.

Phần thân của mỗi case phải chứa ít nhất một câu lệnh thực thi. Không hợp lệ để viết code sau đây, vì case đầu tiên trốnách các

Không giống như câu lệnh chuyển đổi trong C, câu lệnh chuyển đổi này không khớp với cả "a" và "A". Thây vào đó, nó báo cáo một lỗi thời gian biên kịch trong case "a": không chứa bất kỳ câu lệnh thực thi nào. Cách tiếp cận này tránh được sự vô tình từ trường hợp này sang trường hợp khác và làm cho mã an toàn hơn rõ ràng hơn trong ý định của nó.

Để thực hiện chuyển đổi với một case duy nhất cả "a" và "A", hãy kết hợp hai giá trị thành một case ghép, tách các gía trị bằng dấu phẩy.

let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a", "A":
    print("The letter A")
default:
    print("Not the letter A")
}
// Prints "The letter A"

Để dễ đọc, một case ghép cũng có thể viết trên nhiều dòng. Để biết thêm thông tin về các case ghép, xem Compound Cases.

NOTE

Để rõ ràng rơi vào cuối case chuyển đổi cụ thể, hãy sử dụng từ khóa dự phòng, như được mô tả trong  Fallthrough.