最近了解Swift函數式編程,函數式編程的思想就是一切皆函數,函數作為一等公民,可以是被當作變量,參數,返回值。個人理解函數式編程,就是高階函數編程的應用。所以要熟練掌握基礎的高階函數是必須的filter,map,reduce,flatmap就是必備的高階函數。這里的$n表示的是閉包的第n + 1個參數,這是swift的基礎,不多做記錄
filter
Swift中的filter函數的作用就是接受一個閉包作為篩選規(guī)則,自動遍歷集合的每一個元素,保留符合閉包規(guī)則的元素,生成一個新的集合
struct Package{
var name:String
var number:String
var price:Float
var address:String
}
let packages = [
Package(name: "Swift高階函數編程", number: 1, price: 80.0, address: "中關村"),
Package(name: "Swift面向協議編程", number: 2, price: 88.0, address: "西二旗"),
Package(name: "Swift基礎", 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函數的作用就是接受一個閉包作為規(guī)則,自動遍歷集合的每一個元素,使用閉包的規(guī)則去處理這些元素,生成一個結構相同的集合
//將每一個元素的name作為新數組的元素
let let packageNames = packages.map {$0.name}
flatMap
Swift中的flatMap函數的作用就是接受一個閉包作為規(guī)則,自動遍歷集合的每一個元素,使用閉包的規(guī)則去處理這些元素,將處理結果直接放入到一個新的集合里面,可以出現數組降維,并且會自動過濾nil(自動解包),如果是不包含nil元素的一維數組的和map的作用效果是一樣的,所以推薦使用flatMap
let packages = [
Package(name: "Swift高階函數編程", number: 1, price: 80.0, address: "中關村"),
Package(name: "Swift面向協議編程", number: 2, price: 88.0, address: "西二旗"),
Package(name: "Swift基礎", 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函數的作用就是接受一個初始化值,并且接受一個閉包作為規(guī)則,自動遍歷集合的每一個元素,使用閉包的規(guī)則去處理這些元素,合并處理結果
Returns the result of combining the elements of the sequence using the given closure(重點在于combining)
let packages = [
Package(name: "Swift高階函數編程", number: 1, price: 80.0, address: "中關村"),
Package(name: "Swift面向協議編程", number: 2, price: 88.0, address: "西二旗"),
Package(name: "Swift基礎", 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高階函數編程Swift面向協議編程Swift基礎Swift進階"