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; if
, guard
, 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.
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
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):
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).
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.
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ặprepeat
-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
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)
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."
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."
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
Ở 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
}
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.
Bình luận