在 Swift 中窗慎,map()
个束、filter()
和 reduce()
都是高階函數(shù)劲够,它們可以接受其他函數(shù)作為參數(shù),并提供方便的集合迭代和轉(zhuǎn)換操作足丢。這些高階函數(shù)使代碼更具表現(xiàn)力粱腻,提高了代碼重用性和可讀性。
1. map()
map()
函數(shù)可以對集合中的每個(gè)元素進(jìn)行操作斩跌,并返回轉(zhuǎn)換后元素組成的新集合。例如捞慌,對數(shù)組中的所有元素實(shí)施數(shù)值加倍操作:
let numbers = [1, 2, 3, 4, 5]
let doubledNumbers = numbers.map { $0 * 2 }
print(doubledNumbers) // 輸出: [2, 4, 6, 8, 10]
2. filter()
filter()
函數(shù)接收一個(gè)返回布爾值的閉包作為參數(shù)耀鸦,根據(jù)閉包的返回值來篩選集合的元素。僅當(dāng)閉包返回 true
時(shí)啸澡,元素才會(huì)被包含在結(jié)果集中袖订。例如,篩選數(shù)組中所有偶數(shù)元素:
let numbers = [1, 2, 3, 4, 5, 6]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // 輸出: [2, 4, 6]
3. reduce()
reduce()
是 Swift 中的高階函數(shù)嗅虏,它的作用是將集合(如數(shù)組)的元素合并為一個(gè)值洛姑。reduce()
函數(shù)接受兩個(gè)參數(shù):初始值和一個(gè)合并閉包。
閉包參數(shù)有兩個(gè)輸入?yún)?shù):
累積值(Accumulated Value):是當(dāng)前已經(jīng)累積的值皮服,該值在每次迭代時(shí)都會(huì)被更新楞艾。在第一次迭代時(shí)参咙,累積值等于
reduce()
函數(shù)傳入的初始值。當(dāng)前元素(Current Element):表示集合中當(dāng)前正在處理的元素硫眯,它會(huì)在每次迭代中依次處理集合中的每個(gè)元素蕴侧。
閉包的返回值用于更新累積值,以備下一次迭代使用两入。迭代完成后净宵,累積值作為 reduce()
函數(shù)的返回值。
以下舉例說明 reduce()
函數(shù)的用法:
let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0, {
(accumulatedValue: Int, currentElement: Int) -> Int in
return accumulatedValue + currentElement
})
print(sum) // 輸出: 15
在這個(gè)示例中裹纳,reduce()
的初始值為 0择葡,累積值(accumulatedValue
)和當(dāng)前元素(currentElement
)作為輸入?yún)?shù)傳遞給閉包。閉包返回累積值和當(dāng)前元素之和剃氧。在迭代過程中敏储,累積值會(huì)逐步增加,最終累積值 15 被返回她我。
這個(gè)示例等同于以下簡化的尾隨閉包版本:
let sum = numbers.reduce(0) { (accumulatedValue, currentElement) in
return accumulatedValue + currentElement
}
以及更簡潔的尾隨閉包版本:
let sum = numbers.reduce(0) { $0 + $1 }
在這些示例中虹曙,不同形式的閉包參數(shù)都表示相同的概念——累積值和當(dāng)前元素,可以根據(jù)實(shí)際情況選擇使用最合適的版本番舆。