Swift - 高階函式



高階函式是一種特殊的函式型別;它將一個或多個函式作為引數,或者可以返回一個函式作為其結果。它們可以輕鬆地操作和轉換給定集合的資料,而無需建立任何額外的使用者定義函式。以下是 Swift 語言提供的高階函式:

  • forEach()
  • map()
  • compactMap()
  • flatMap()
  • filter()
  • reduce()
  • sort()
  • sorted()

所有高階函式都基於閉包,但不用擔心,您不必成為閉包大師。它們易於使用,還可以減少專案中程式碼的大小,並且可以重用。

forEach() 函式

ForEach() 函式與 for-in 迴圈非常相似。它將迭代集合(例如陣列)中的所有元素,並且不返回任何內容。請記住,您不能在 forEach() 函式內部使用 continue 和 break 來退出當前正在執行的語句。

語法

以下是 forEach() 函式的語法:

func forEach(_x: (Self.Element)throws-> Void) rethrows

引數

x 表示一個閉包,它將給定序列中的一個專案作為引數。

示例

使用 forEach() 函式顯示陣列所有元素的 Swift 程式。

import Foundation

let numbersInWord = ["One", "Two", "Three", "Four", "Five", "Six"]
numbersInWord.forEach { 
   element in print(element)
}

輸出

它將產生以下輸出:

One
Two
Three
Four
Five
Six

map() 函式

map 函式透過對集合的所有元素執行操作並返回一個包含該操作結果的新集合來工作。此函式旨在將物件從一種型別轉換為另一種型別(以及相同型別)。

語法

以下是 map() 函式的語法:

func map<T>(_ mTransform: (Self.Element) throws -> T) rethrows -> [T]

引數

mTransform 是一個對映閉包。它接受來自給定序列的元素,並返回相同或不同型別的轉換值。

返回值

它將返回一個轉換後的陣列。

示例

使用 map() 函式將整數轉換為字串的 Swift 程式。

import Foundation

let numbers = [1, 2, 3, 4, 5, 6, 7]
let numbersInString = numbers.map { 
   number in String(number)
}
print("numbersInString: \(numbersInString)")

輸出

它將產生以下輸出:

numbersInString: ["1", "2", "3", "4", "5", "6", "7"]

compactMap() 函式

compactMap() 遍歷陣列中的元素,僅返回一個更新後的陣列,其中包含滿足其主體中陳述的條件的元素。陣列將在沒有任何導致 nil 值的元素的情況下更新。或者我們可以說 compactMap() 迴圈遍歷陣列中的所有元素並返回非 nil 值。

語法

以下是 compactMap() 函式的語法:

Func compactMap<ElementOfResult>(_ mTransform: 
(Self.Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]

引數

mTransform 是一個閉包。它接受來自給定序列的元素,並返回一個可選值。

返回值

它將返回一個包含非 nil 值的轉換後的陣列。

示例

使用 comapctMap() 函式將字串陣列轉換為整數陣列的 Swift 程式。

import Foundation

let numbersInString = ["1", "x2", "3", "4", nil, "five5"]
let validNumbers = numbersInString.compactMap { 
   stringValue in
   Int(stringValue ?? "")
}
print("validNumbers: \(validNumbers)")

輸出

它將產生以下輸出:

validNumbers: [1, 3, 4]

flatMap() 函式

flatMap() 函式允許我們將一組陣列轉換為包含所有元素的單個集合。它將指定集合的元素連線到結果集合中。

語法

以下是 flatMap() 函式的語法:

func map<SegmentOfResult>(_ mTransform: 
(Self.Element) throws -> SegmentOfResult) rethrows -> 
[SegmentOfResult.Element] where SegmentOfResult : Sequence

引數

mTransform 是一個閉包。它接受來自給定序列的元素,並返回一個序列。

返回值

它將返回一個扁平化的陣列。

示例

使用 flatMap() 函式將多維陣列轉換為一維陣列的 Swift 程式。

import Foundation

let marks = [[3, 4, 5], [2, 5, 3], [1, 2, 2], [5, 5, 4], [3, 5, 3]]
let allMarks = marks.flatMap { 
   marksArray -> [Int] in
   marksArray
}
print("allMarks: \(allMarks)")

輸出

它將產生以下輸出:

allMarks: [3, 4, 5, 2, 5, 3, 1, 2, 2, 5, 5, 4, 3, 5, 3]

filter() 函式

filter() 將迭代陣列中的所有元素,並且將僅返回一個更新後的陣列,其中包含滿足 filter 主體內部編寫的條件的元素。這是一個重要的函式。在編寫程式碼時,您需要多次過濾集合以根據條件生成過濾後的集合。

閉包的返回型別是 Bool 值;結果陣列中的專案是滿足主體內部條件的那些專案;

語法

以下是 filter() 函式的語法:

func filter(_ resultantCollection: (Self.Element) throws -> Bool) rethrows -> Self

引數

resultantCollection 是一個閉包。它接受來自給定序列的元素,並返回一個布林值,該值指示元素是否應包含在結果集合中。

返回值

它將返回一個僅包含滿足主體內部條件的專案的集合。

示例

使用 filter() 函式從給定陣列中僅顯示正數的 Swift 程式。

import Foundation

let numbers = [-12, 23, -1, 56, 9, -2, 0, 14, 8]
let positives = numbers.filter { 
   number in
   number > 0
}
print("positives: \(positives)")

輸出

它將產生以下輸出:

positives: [23, 56, 9, 14, 8]

reduce() 函式

reduce() 函式將迭代陣列中的所有元素,並返回一個包含所有元素組合值的的物件。

語法

以下是 reduce() 函式的語法:

func reduce<Result>(_initialRes: Result, _nestRes: (Result, Self.Element) throws -> T) 
rethrows -> Result) rethrows->Result

引數

此函式採用兩個引數:

  • 引數 initialRes 用於儲存初始累積值,該值在第一次執行閉包時進一步傳遞給 nextRes。

  • nextRes 是一個閉包,用於將累積值和序列的元素組合成一個新的累積值,該值在 nextRes 閉包的後續呼叫中進一步使用。

返回值

它將返回最終值。或者如果序列不包含任何專案,則它將返回 initialRes。

示例

使用 reduce() 函式查詢陣列元素總和的 Swift 程式。

import Foundation

let numbers = [1, 5, 2, 10, 6]
let sum = numbers.reduce(0) { 
   (result, number) -> Int in
   result + number
}
print("sum:", sum)

輸出

它將產生以下輸出:

sum: 24

sort() 函式

sort() 函式將以升序對給定集合的所有元素進行排序。它也可以以降序對元素進行排序。

語法

以下是 sort() 函式的語法:

func sort()

引數

它不接受任何引數。

返回值

它將返回一個排序後的集合。

示例

使用 sort() 函式對陣列元素進行排序的 Swift 程式。

import Foundation

var numbers = [1, 5, 2, 10, 6]
numbers.sort()
print("Sorted numbers: \(numbers)")

輸出

它將產生以下輸出:

Sorted numbers: [1, 2, 5, 6, 10]

sorted() 函式

sorted() 函式將根據閉包主體中編寫的條件對所有元素進行排序,並返回一個新的排序後的陣列。它可以以升序和降序對元素進行排序。

語法

以下是 sorted() 函式的語法:

func sorted()

引數

它不接受任何引數。

返回值

它將返回一個排序後的集合。

示例

使用 sorted() 函式對陣列元素進行排序的 Swift 程式。

import Foundation

var numbers = [1, 5, 2, 10, 6]
let sorted_values = numbers.sorted()
print("Sorted numbers: \(sorted_values)")

輸出

它將產生以下輸出:

Sorted numbers: [1, 2, 5, 6, 10]
廣告