Swift 控制流程 for-in Loop 教學

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

swift 1

For-In Loops

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

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

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

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

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

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

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

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

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

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

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

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

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

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"

而 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 的思考模式,我們可能會有以下的函式

int sum = 0;
for (int i = 0; i < 100; i=i+5){
    sum = sum + i;
}

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

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

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

int sum = 0;
for (int i = 0; i <= 100; i=i+5){
    sum = sum + i;
}

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

for i in stride(from: 0, through: 100, by: 5) {
    sum = sum + i
}
Subscribe
Notify of
guest

2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
trackback

[…] Swift 控制流程 for-in Loop 教學 […]

trackback

[…] Swift 中,如果我們要過濾出陣列中的某些元素,最常用的就是 for-in loop 了,使用迴圈來過濾固然是一個不錯的方式,但在追求精簡的 Swift […]