最近了解Swift函數(shù)式編程,函數(shù)式編程的思想就是一切皆函數(shù)恨樟,函數(shù)作為一等公民半醉,可以是被當作變量,參數(shù)厌杜,返回值奉呛。個人理解函數(shù)式編程,就是高階函數(shù)編程的應用夯尽。所以要熟練掌握基礎(chǔ)的高階函數(shù)是必須的filter,map登馒,reduce匙握,flatmap就是必備的高階函數(shù)。這里的$n表示的是閉包的第n + 1個參數(shù)陈轿,這是swift的基礎(chǔ)圈纺,不多做記錄
filter
Swift中的filter函數(shù)的作用就是接受一個閉包作為篩選規(guī)則秦忿,自動遍歷集合的每一個元素,保留符合閉包規(guī)則的元素蛾娶,生成一個新的集合
struct Package{
var name:String
var number:String
var price:Float
var address:String
}
let packages = [
Package(name: "Swift高階函數(shù)編程", number: 1, price: 80.0, address: "中關(guān)村"),
Package(name: "Swift面向協(xié)議編程", number: 2, price: 88.0, address: "西二旗"),
Package(name: "Swift基礎(chǔ)", number: 3, price: 35.0, address: "798"),
Package(name: "Swift進階", number: 4, price: 50.0, address: "望京soho")
]
let package80s = packages.filter { (package) -> Bool in
return package.price == 80
}
print(package80s)
package80s = packages.filter {$0.price == 80}
print(package80s)
map
Swift中的map函數(shù)的作用就是接受一個閉包作為規(guī)則灯谣,自動遍歷集合的每一個元素,使用閉包的規(guī)則去處理這些元素蛔琅,生成一個結(jié)構(gòu)相同的集合
//將每一個元素的name作為新數(shù)組的元素
let let packageNames = packages.map {$0.name}
flatMap
Swift中的flatMap函數(shù)的作用就是接受一個閉包作為規(guī)則胎许,自動遍歷集合的每一個元素,使用閉包的規(guī)則去處理這些元素罗售,將處理結(jié)果直接放入到一個新的集合里面辜窑,可以出現(xiàn)
數(shù)組降維
,并且會自動過濾nil
(自動解包)寨躁,如果是不包含nil
元素的一維數(shù)組的和map的作用效果是一樣的穆碎,所以推薦使用flatMap
let packages = [
Package(name: "Swift高階函數(shù)編程", number: 1, price: 80.0, address: "中關(guān)村"),
Package(name: "Swift面向協(xié)議編程", number: 2, price: 88.0, address: "西二旗"),
Package(name: "Swift基礎(chǔ)", number: 3, price: 35.0, address: "798"),
nil,
Package(name: "Swift進階", number: 4, price: 80.0, address: "望京soho")
]
let packageNames = packages.flatMap { (package) -> String? in
return package?.name
}
reduce
Swift中的reduce函數(shù)的作用就是接受一個
初始化值
,并且接受一個閉包作為規(guī)則职恳,自動遍歷集合的每一個元素所禀,使用閉包的規(guī)則去處理這些元素,合并處理結(jié)果
Returns the result of combining the elements of the sequence using the given closure(重點在于combining)
let packages = [
Package(name: "Swift高階函數(shù)編程", number: 1, price: 80.0, address: "中關(guān)村"),
Package(name: "Swift面向協(xié)議編程", number: 2, price: 88.0, address: "西二旗"),
Package(name: "Swift基礎(chǔ)", number: 3, price: 35.0, address: "798"),
Package(name: "Swift進階", number: 4, price: 50.0, address: "望京soho")
]
let reduceName = packages.reduce("") {$0 + $1.name}
//reduceName = "Swift高階函數(shù)編程Swift面向協(xié)議編程Swift基礎(chǔ)Swift進階"