假如我們有一個數(shù)組女仰,對這個數(shù)組reduce的話蹂窖,請看下圖:
其中:
initial
表示reduce計算的初始值轧抗;
combine
是一個閉包,或者說是函數(shù)吧瞬测,別閉包閉包的横媚,聽著就有點怕怕。
那么月趟,我們看看這個函數(shù)灯蝴,他接收一個T
,和一個Int
孝宗。
打住穷躁,我們分析一下,T
和Int
分別代表什么!
T
很顯然是一個泛型因妇,回看一下我們的initial
问潭,我們發(fā)現(xiàn)他也是T
猿诸,因此,combine
中的T
狡忙,顯然就是上一步計算的值梳虽,我們也可以說是中間結(jié)果。那么灾茁,有好學(xué)的同學(xué)就要問了窜觉,第一次combine
,T
是啥北专,很顯然他會和initial
給定的相同咯禀挫。
Int
是什么,自然就是[1,2,3,4]中的各個element
咯拓颓。
然后特咆,你就懂了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
華麗的分割線后面一定有一段干貨录粱,讓我們看看腻格,下面這段代碼,他將字典[String:String]
的元素中key
為name
的字段替換為Canada
啥繁,將key
為country
的字段設(shè)置為首字母大寫
菜职,你看懂了沒~~
let bands: [[String: String]] = [
["name": "sunset rubdown", "country": "UK"],
["name": "women", "country": "Germany"],
["name": "a silver mt. zion", "country": "Spain"]
]
typealias BandProperty = String
typealias Band = [String: BandProperty]
typealias BandTransform = Band -> Band
typealias BandPropertyTransform = BandProperty -> BandProperty
let canada: BandPropertyTransform = { _ in return "Canada" }
let capitalize: BandPropertyTransform = { return $0.capitalizedString }
// 輔助函數(shù)
func call(fun: BandPropertyTransform, onValueForKey key: String) -> BandTransform {
return {
band in
var newBand = band
newBand[key] = fun(band[key]!)
return newBand
}
}
let setCanadaAsCountry: BandTransform = call(canada, onValueForKey: "country")
let capitalizeName: BandTransform = call(capitalize, onValueForKey: "name")
//注意,我們把這種方式稱之為管道旗闽,為什么這么說酬核,因為他實在是太形象了,可以看到适室,對bands中的每一個元素嫡意,使用functions中的function進行加工
//讓我們產(chǎn)生了無盡的遐想,是否 回憶起了 grep "hello world" | xargs ....
// 一切都是那么的順其自然捣辆,啰嗦了蔬螟,因為我發(fā)現(xiàn)這個太有用了,所以情不自禁的寫了這么多注釋~~~
func formattedBands(bands: [Band], functions: [BandTransform]) -> [Band] {
return bands.map {
band in
functions.reduce(band) { (currband, function) -> Band in
return function(currband)
}
}
}
print(formattedBands(bands, functions: [setCanadaAsCountry, capitalizeName]))
那么汽畴,有比較好奇的同學(xué)旧巾,肯定會問,外面用map沒有問題忍些,但是鲁猩,里面你怎么就知道要用reduce,誒罢坝,問得太好了廓握,這個也是我在看之前的疑問,reduce可以保存中間狀態(tài)啊,可以將狀態(tài)帶到下一次運算啊隙券,相當(dāng)于管道的中間結(jié)果啊戈钢,輸送給下一個車間處理。
那么是尔,為什么不用map呢,那我們試試唄开仰,
這里拟枚,是我們要使用function對band做轉(zhuǎn)換,我們要想到其可能的調(diào)用方式是function(band)众弓,如果牢牢扣住這點恩溅,你將會很自然的想到去使用reduce。