Swift 中的高階函式是什麼?
在本教程中,您將學習 Swift 中可用的高階函式。您將瞭解它們的用途以及如何使用它們。
它們是什麼?
高階函式是指將一個或多個函式作為引數,或者返回一個函式作為其結果的函式。以下是 Swift 語言提供的高階函式:
forEach()
map()
compactMap()
flatMap()
filter()
reduce()
sort()
sorted()
所有高階函式都基於閉包,但不用擔心,您不需要成為閉包大師。它們易於使用,還可以減小專案中程式碼的體積。
為什麼要使用它們?
您確實可以不用高階函式也能做到同樣的事情。但是,在程式碼中使用高階函式,您可以避免實現 Swift 語言中以非常最佳化的方式已經提供的函式。
在這裡,我們將透過示例檢視所有函式。每個函式都將結合實際示例進行詳細討論。
forEach()
它將迭代集合(例如陣列)中的所有元素,但不返回任何內容。請記住,您不能在 forEach 函式中使用 continue 和 break 來退出當前正在執行的語句。
ForEach 函式類似於 for-in 迴圈,區別在於您不能在 forEach 函式中使用 continue 和 break 語句。
示例
let numbersInWord = ["One", "Two", "Three", "Four", "Five", "Six"]
numbersInWord.forEach {
element in print(element)
}
輸出
One Two Three Four Five Six
解釋
在上面的示例中,您可以看到 forEach 函式正在迭代所有元素。當您想要迭代所有元素而不中斷執行流程時,最好使用 forEach()。
map()
map 函式的工作原理是對集合的所有元素執行操作,並返回包含該操作結果的新集合。
此函式旨在將物件從一種型別轉換為另一種型別(以及同一型別)。
示例 1
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"]
解釋
在上面的示例中,您使用 map 函式將每個 Int 轉換為 String。您可以看到對映所有輸入元素有多麼容易。
無論如何,我們可以使用簡寫引數 $0 來減少此表示式,$0 指的是陣列的任何元素。以下是一個示例:
示例 2
let lowercasedNumbers = ["one", "two", "three", "four"]
let uppercasedNumbers = lowercasedNumbers.map({ $0.uppercased() })
print("uppercasedNumbers: \(uppercasedNumbers)")
輸出
uppercasedNumbers: ["ONE", "TWO", "THREE", "FOUR"]
解釋
在上面的示例中,我們使用了 $0,它表示簡寫引數名稱,用於訪問閉包塊內的元素。在這裡,$0 將為您提供當前引數的值。
compactMap()
compactMap() 迭代陣列中的元素,僅返回一個更新後的陣列,其中只包含滿足其主體中宣告的條件的元素。該陣列將被更新,其中不包含任何導致 nil 值的元素。
因此,compactMap 迴圈遍歷陣列中的所有元素並返回非 nil 值。
示例
let numbersInString = ["1", "x2", "3", "4", nil, "five5"]
let validNumbers = numbersInString.compactMap {
stringValue in
Int(stringValue ?? "")
}
print("validNumbers: \(validNumbers)")
輸出
validNumbers: [1, 3, 4]
解釋
在上面的示例中,生成的陣列將不包含任何 nil 值。生成的陣列保證具有非 nil 值。
flatMap()
flatMap 函式允許我們將一組陣列轉換為包含所有元素的單個集合。
示例
這是一個包含其他陣列作為元素的陣列。假設每個內部陣列包含學生三門不同課程的成績:
let marks = [[3, 4, 5], [2, 5, 3], [1, 2, 2], [5, 5, 4], [3, 5, 3]]
現在我們必須組合所有分數並將結果放入單個數組中。
我們可以執行 for-in 迴圈並將每個陣列的所有元素附加到結果陣列中。但是,如果 Swift 語言提供了 flatMap 函式,為什麼還需要手動執行此操作呢?它需要更少的精力,並且經過最佳化。
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 主體內部編寫的條件的元素。
在 Swift 中,它始終是一個必不可少的函式。在編寫程式碼時,您經常需要過濾集合以根據條件生成過濾後的集合。
閉包的返回型別為 Bool 值;結果陣列中的專案是滿足主體內部條件的那些專案;
示例
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 函式將迭代陣列中的所有元素,並返回一個包含所有元素組合值的物件。
示例
let numbers = [1, 5, 2, 10, 6]
let sum = numbers.reduce(0) {
(result, number) -> Int in
result + number
}
print("sum:", sum)
輸出
sum: 24
解釋
上面,第一個引數是前一次計算的結果,它將新增到數值中。您可以理解 reduce 函式背後的邏輯如下:
// 1st iteration: result = 0, number = 1, Return 1 // 2nd iteration: result = 1, number = 5, Return 6 // 3rd iteration: result = 6, number = 2, Return 8 // 4th iteration: result = 8, number = 10, Return 18 // 5th iteration: result = 18, number = 6, Return 24
sort() & sorted()
sort 函式將根據閉包主體中編寫的條件對所有元素進行排序。
sorted 函式將根據閉包主體中編寫的條件對所有元素進行排序,並返回一個新的已排序陣列。
sort()
示例
var numbers = [1, 5, 2, 10, 6]
numbers.sort()
print("Sorted numbers: \(numbers)")
輸出
Sorted numbers: [1, 2, 5, 6, 10]
解釋
在上面的示例中,我們初始化了一個包含未排序數字的變數。我們必須在不使用任何其他變數或常量的情況下對它們進行排序。在這種情況下,我們使用 sort() 函式在同一變數內對元素進行排序。
請注意,我們可以在變數上使用 sort(),而不是在常量上使用 sort(),因為 sort() 使用相同的變數對元素進行排序。
sorted()
示例
let numbers = [1, 5, 2, 10, 6]
let sortedArray = numbers.sorted()
print("sortedArray:", sortedArray)
輸出
sortedArray: [1, 2, 5, 6, 10]
解釋
此函式對元素進行排序並返回一個新的已排序陣列。
結論
本文演示瞭如何在 Swift 中使用高階函式。您現在有足夠的信心在您的程式碼中使用它們。確保您瞭解更多關於它們的資訊並進行一些實際示例。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP