Swift開發基礎08-高階函式

Mr.陳發表於2024-07-18

高階函式是指接受其它函式作為引數,或者返回其它函式的函式。Swift 提供了許多內建的高階函式,這些函式在處理集合型別資料(如陣列、集合等)時尤其有用。常見的高階函式包括 mapfilterreduceflatMapcompactMap

一、常用高階函式

1. map

map 函式會對集合中的每個元素應用一個相同的操作,並將結果聚合成一個新的集合。

示例:

假設我們有一個包含整數的陣列,並希望將每個整數乘以2。

let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
print(doubled)  // 輸出: [2, 4, 6, 8, 10]

2. filter

filter 函式會對集合中的每個元素進行條件判斷,並返回符合條件的元素構成的新的集合。

示例:

我們有一個陣列,需要過濾出所有的偶數。

let numbers = [1, 2, 3, 4, 5]
let evens = numbers.filter { $0 % 2 == 0 }
print(evens)  // 輸出: [2, 4]

3. reduce

reduce 函式會將集合中的元素組合成一個值,透過應用一個累計的操作。它需要一個初始值和一個合併操作。

示例:

我們有一個陣列,需要計算所有元素的總和。

let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0) { $0 + $1 }
print(sum)  // 輸出: 15

使用閉包語法可以簡潔一點:

let sum = numbers.reduce(0, +)
print(sum)  // 輸出: 15

4. flatMap

flatMap 會對多維集合進行扁平化操作,並將子集合中每一個元素應用特定的操作,然後返回一個新的集合。

示例:

我們有一個由陣列組成的陣列,需要將其展平成一個單一的陣列。

let arrayOfArrays = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
let flattened = arrayOfArrays.flatMap { $0 }
print(flattened)  // 輸出: [1, 2, 3, 4, 5, 6, 7, 8, 9]

5. compactMap

compactMapmap 相似,但它會移除所有結果中的 nil 值。通常用於處理返回 Optional 的操作。

示例:

我們有一個字串陣列,希望將其轉換為整數,但其中有些值無法轉換。

let strings = ["1", "2", "three", "4", "five"]
let numbers = strings.compactMap { Int($0) }
print(numbers)  // 輸出: [1, 2, 4]

6. 自定義高階函式

除了 Swift 提供的這些高階函式,你也可以根據需要定義自己的高階函式。

示例:

我們定義一個高階函式,該函式接受一個過濾條件並返回符合條件的陣列:

func customFilter<T>(array: [T], condition: (T) -> Bool) -> [T] {
    var result = [T]()
    for element in array {
        if condition(element) {
            result.append(element)
        }
    }
    return result
}

let numbers = [1, 2, 3, 4, 5]
let evens = customFilter(array: numbers) { $0 % 2 == 0 }
print(evens)  // 輸出: [2, 4]

二、其他高階函式

除了已經介紹的 mapfilterreduceflatMapcompactMap 之外,Swift 還提供了其他一些內建的高階函式。

1. forEach

forEach 函式會對集合中的每一個元素執行指定的操作,但不會返回結果。它通常用作遍歷集合的一個簡潔替代。

示例:

let numbers = [1, 2, 3, 4, 5]
numbers.forEach { number in
    print(number)
}

2. sortedsort

sorted 函式會返回一個排序後的新陣列,而 sort 方法則會原地排序陣列。

示例:

let numbers = [5, 3, 1, 4, 2]
let sortedNumbers = numbers.sorted()
print(sortedNumbers)  // 輸出: [1, 2, 3, 4, 5]

使用自定義排序規則:

let sortedDescending = numbers.sorted { $0 > $1 }
print(sortedDescending)  // 輸出: [5, 4, 3, 2, 1]

原地排序:

var numbers = [5, 3, 1, 4, 2]
numbers.sort()
print(numbers)  // 輸出: [1, 2, 3, 4, 5]

3. contains

contains 函式用於檢查集合中是否包含某個元素。

示例:

let numbers = [1, 2, 3, 4, 5]
let containsThree = numbers.contains(3)
print(containsThree)  // 輸出: true

或者使用自定義條件:

let hasEvenNumber = numbers.contains { $0 % 2 == 0 }
print(hasEvenNumber)  // 輸出: true

4. first(where:)last(where:)

first(where:) 函式會返回滿足條件的第一個元素,last(where:) 會返回滿足條件的最後一個元素。

示例:

let numbers = [1, 2, 3, 4, 5]
if let firstEven = numbers.first(where: { $0 % 2 == 0 }) {
    print(firstEven)  // 輸出: 2
}

if let lastEven = numbers.last(where: { $0 % 2 == 0 }) {
    print(lastEven)  // 輸出: 4
}

5. allSatisfy

allSatisfy 函式會檢查集合中的所有元素是否都滿足指定的條件。

示例:

let numbers = [2, 4, 6, 8, 10]
let allEven = numbers.allSatisfy { $0 % 2 == 0 }
print(allEven)  // 輸出: true

6. dropFirstdropLast

dropFirst 函式會移除集合的第一個元素,dropLast 函式則會移除集合的最後一個元素。

示例:

let numbers = [1, 2, 3, 4, 5]
let withoutFirst = numbers.dropFirst()
print(withoutFirst)  // 輸出: [2, 3, 4, 5]

let withoutLast = numbers.dropLast()
print(withoutLast)  // 輸出: [1, 2, 3, 4]

7. prefixsuffix

prefix 函式會返回集合的前幾個元素,suffix 函式會返回集合的最後幾個元素。

示例:

let numbers = [1, 2, 3, 4, 5]
let firstThree = numbers.prefix(3)
print(firstThree)  // 輸出: [1, 2, 3]

let lastTwo = numbers.suffix(2)
print(lastTwo)  // 輸出: [4, 5]

8. zip

zip 函式會合並兩個集合,依次建立對應的元素對,形成一個新的序列。

示例:

let names = ["Alice", "Bob", "Charlie"]
let ages = [25, 30, 35]
let combined = zip(names, ages)

for (name, age) in combined {
    print("\(name) is \(age) years old")
}
// 輸出:
// Alice is 25 years old
// Bob is 30 years old
// Charlie is 35 years old

9. reduce(into:)

reduce(into:) 可以用來將集合的元素聚合成一個新集合,避免像 reduce 那樣頻繁地建立新值,從而提高效能。

示例:

let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.reduce(into: [Int]()) { result, number in
    result.append(number * 2)
}
print(doubled)  // 輸出: [2, 4, 6, 8, 10]

總結

Swift 提供了豐富的內建高階函式,這些函式極大地簡化了對集合資料的處理,使程式碼更加簡潔和功能性更強。透過靈活運用這些高階函式,可以減少程式碼中的迴圈和條件判斷,使程式碼更具可讀性和維護性。瞭解並掌握這些高階函式,可以幫助你編寫更加簡潔、高效和優雅的 Swift 程式碼。

相關文章