高階函式是指接受其它函式作為引數,或者返回其它函式的函式。Swift 提供了許多內建的高階函式,這些函式在處理集合型別資料(如陣列、集合等)時尤其有用。常見的高階函式包括 map
、filter
、reduce
、flatMap
和 compactMap
。
一、常用高階函式
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
compactMap
與 map
相似,但它會移除所有結果中的 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]
二、其他高階函式
除了已經介紹的 map
、filter
、reduce
、flatMap
和 compactMap
之外,Swift 還提供了其他一些內建的高階函式。
1. forEach
forEach
函式會對集合中的每一個元素執行指定的操作,但不會返回結果。它通常用作遍歷集合的一個簡潔替代。
示例:
let numbers = [1, 2, 3, 4, 5]
numbers.forEach { number in
print(number)
}
2. sorted
和 sort
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. dropFirst
和 dropLast
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. prefix
和 suffix
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 程式碼。