一.內(nèi)容概述
在上一篇中介紹了什么是函數(shù)式編程, 以及介紹了最常用的一個函數(shù)式編程函數(shù)Filter
詳情請查看 Swift中的函數(shù)式編程
這篇文章中介紹函數(shù)式編程中另外兩個非常常用和重要的函數(shù): Map&Reduce
理解了這兩個東西基本對函數(shù)式編程就會有一定的理解和認識.
二. Map的使用
1. Map的介紹
Map在此處并非地圖的意思, 它的含義是映射
將一個元素映射成另外一種元素(類似于字典中的Key/Value映射)
其實Swift系統(tǒng)本身是有映射的函數(shù), 可以將一個集合映射成另外一個集合
2. 示例分析
比如:
將一個String類型的數(shù)組, 映射成一個Int類型的數(shù)組
將一個String類型的數(shù)組, 映射成一個Emoji數(shù)組
如何使用呢?
// 1.定義字符串?dāng)?shù)組
let animals = ["DRAGON", "CAT", "TIGER"]
// 2.使用函數(shù)映射
let animalEmojis = animals.map { (str : String) -> Character in
let tmp = "\\N{\(str)}"
let emojiStr =
tmp.stringByApplyingTransform(
NSStringTransformToUnicodeName,
reverse: true)
return emojiStr!.characters.first!
}
// 3.打印結(jié)果
print(animalEmojis)
結(jié)果如下:
分析map后面的大括號{}
其實{}本身也可以是一個函數(shù)
例如我單獨將函數(shù)抽取出來,并且傳入.
代碼如下:
// 0.定義字符串?dāng)?shù)組
let animals = ["DRAGON", "CAT", "TIGER"]
// 1.抽取函數(shù)
func strToEmoji(str : String) -> Character {
let tmp = "\\N{\(str)}"
let emojiStr =
tmp.stringByApplyingTransform(
NSStringTransformToUnicodeName,
reverse: true)
return emojiStr!.characters.first!
}
// 2.將函數(shù)傳入
let animalEmojis = animals.map(strToEmoji)
// 3.打印結(jié)果
print(animalEmojis)
代碼分析:
通過上述代碼我們知道, 其實map函數(shù)是接收一個函數(shù)作為參數(shù).
而函數(shù)本身是告訴map函數(shù), 在映射過程中究竟是進行怎樣的轉(zhuǎn)化
3.定義自己的Map函數(shù)
我們可以給Array擴展一個函數(shù), 函數(shù)接收一個閉包參數(shù)
// 1.定義自己的map函數(shù)
extension Array {
func myMap<SrcType, DestType>(transform: (SrcType) -> (DestType)) -> [DestType] {
var output: [DestType] = []
for item in self {
let transformed =
transform(item as! SrcType)
output.append(transformed)
}
return output
}
}
// 2.使用自己的map函數(shù)
let animals = ["DRAGON", "CAT", "TIGER"]
let animalEmojis = animals.myMap { (str : String) -> (Character) in
let tmp = "\\N{\(str)}"
let emojiStr =
tmp.stringByApplyingTransform(
NSStringTransformToUnicodeName,
reverse: true)
return emojiStr!.characters.first!
}
print(animalEmojis)
代碼分析
Map有兩個泛型類型, 一個是原始類型, 一個是目標類型
在自己的Map函數(shù)中, 使用外界傳入的函數(shù), 進行轉(zhuǎn)化, 并且生成新的類型
放入數(shù)組中, 進行返回即可
二. Reduce的使用
1.Reduce的介紹
Reduce也是函數(shù)式編程中很常見的一個函數(shù)
它的作用是用于將集合中的內(nèi)容合并起來, 獲取到合并后的結(jié)果
合并的規(guī)則可以由調(diào)用者來指定, 可以是:相加/相乘/字符串拼接.
總之, 你告訴函數(shù)如何合并, 函數(shù)會給你一個合并后的結(jié)果
2.Reduce的使用
// 1.定義數(shù)組
let numbers = [1, 2, 3, 4, 5]
// 2.合并數(shù)組中所有的元素
// 2.1.普通做法
var total = 0
for num in numbers {
total += num
}
// 2.2.函數(shù)式編程中Reduce
var total1 = numbers.reduce(0) { (num1 : Int, num2 : Int) -> Int in
return num1 + num2
}
var total2 = numbers.reduce(0) { $0 + $1 }
代碼解析
有一個Int類型數(shù)組, 想要將數(shù)組中元素合并
普通做法是直接遍歷, 但是如果我們不是相加, 有其他合并需求, 則需要更改for循環(huán)中的需求
但是通過我們系統(tǒng)提供的reduce, 讓我們直接傳入閉包. 并且告知函數(shù)規(guī)則, 就可以進行合并
reduce函數(shù)接收兩個參數(shù):
參數(shù)一: 第一次合并之前的初始化值
參數(shù)二: 閉包參數(shù), 閉包中的參數(shù)一是每次合并后的值, 第二個參數(shù)是后面要合并的元素
{ $0 + $1 } --> 閉包的一種簡便寫法
3. 定義自己的Reduce函數(shù)
我們還是給系統(tǒng)的Array擴充一個自己的Reduce方法
// 1.定義自己的Reduce函數(shù)
extension Array {
func myReduce<C, T>(initial: C, combine: (C, T) -> C) -> C {
var seed = initial
for item in self {
seed = combine(seed, item as! T)
}
return seed
}
}
// 2.定義數(shù)組
let numbers = [1, 2, 3, 4, 5]
// 3.使用自己的Reduce函數(shù)
let result = numbers.myReduce(1) { (num1 : Int, num2 : Int) -> Int in
return num1 * num2
}
// 4.打印結(jié)果
print(result)
代碼解析
我們給系統(tǒng)的Array擴充了一個myReduce函數(shù)
函數(shù)需要兩個參數(shù):
參數(shù)一: 合并之前的初始化值, 因為我要進行相乘, 所有應(yīng)該初始化值為1. 否則后面的結(jié)果都是0
參數(shù)二: 閉包, 也就是合并規(guī)則
最后編輯于 :2017.12.04 02:56:50
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者 【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。 平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。