Swift 控制流程 for-in Loop 教學

跟其它語言一樣,Swift 提供了 for、while、if、switch…等常見的流程控制,而這些流程控制的關鍵字,在程式中也占有舉足輕重的地位,而因為控制流程實在太多,故本篇先專注於控制流程 for-in Loop 的探討唷!

For-In Loops

for-in 是從集合中將物件取出並且逐一執行,以下列的例子來說,我們有一個陣列叫做 names,這時我們就可以使用 for-in 將物件取出,並且印出來。

  1. let names = ["Anna", "Alex", "Brian", "Jack"]
  2. for name in names {
  3.     print("Hello, \(name)!")
  4. }
  5. // Hello, Anna!
  6. // Hello, Alex!
  7. // Hello, Brian!
  8. // Hello, Jack!

 

如果物件是 dictionary,也可以用 for-in 將物件取出喔!

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

 

在 Swift 提供 Closed Range Operator   讓程式設計師做使用,以下列例子來說,如果是 1…5,代表 1~5 的意思。

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

 

還有一種叫做 Half-Open Range Operator ..<  讓程式設計師做使用,以下列例子來說,如果是 1..<5,代表 1~4 的意思。

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

 

但無論是 Closed Range Operator 或是  Half-Open Range Operator,都規定要從小到大,那麼們如果要大到小怎麼辦呢?用 reversed 這個關鍵字就可以囉!記得要將 Range Operator 以括號括起來喔,以下是例子!

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

 

底下是另一個例子,在這個例子中,我們發現了 index 其實並沒有用到。

  1. let base = 3
  2. let power = 10
  3. var answer = 1
  4. for index in 1...power { //index 沒有使用
  5.   answer *= base
  6. }
  7. print("\(base) to the power of \(power) is \(answer)")
  8. // Prints "3 to the power of 10 is 59049"

 

所以,我們可以將 index 使用 _ 來取代。

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

 

而 Swift 還提供了函式 stride,以下是他的函式原型。

public func stride<T>(from start: T, to end: T, by stride: T.Stride) -> StrideTo<T> where T : Strideable
public func stride<T>(from start: T, through end: T, by stride: T.Stride) -> StrideThrough<T> where T : Strideable

 

舉例來說,以傳統的 Objetive-C 的思考模式,我們可能會有以下的函式

  1. int sum = 0;
  2. for (int i = 0; i < 100; i=i+5){
  3.     sum = sum + i;
  4. }

但在 Swift 中,則必須寫成這樣才行。其中 from 是開始, to 是終止的數字,by 是每次相加的數字。要記住的是,stride-from-to-by 屬於 Half-Open Range Operator,所以不會包含 to 喔!

  1. for i in stride(from: 0, to: 100, by: 5) {
  2.     sum = sum + i
  3. }

 

另一個例子,以傳統的 Objetive-C 的思考模式,我們可能會有以下的函式。

  1. int sum = 0;
  2. for (int i = 0; i <= 100; i=i+5){
  3.     sum = sum + i;
  4. }

 

但在 Swift 中,則必須寫成這樣才行。其中 from 是開始, through 是終止的數字,by 是每次相加的數字。要記住的是,stride-from-through-by 屬於 Closed Range Operator ,所以會包含 through 喔!

  1. for i in stride(from: 0, through: 100, by: 5) {
  2.     sum = sum + i
  3. }