Swift是一門面向協(xié)議的語(yǔ)言,在使用Swift時(shí)我們已經(jīng)充分享受到了面向協(xié)議編程帶給我們的便利,但是Swift相比Obj-C還有一個(gè)更重要的優(yōu)點(diǎn),那就是對(duì)函數(shù)式編程提供了很好的支持,其中Swift提供了map,filter,reduce這三個(gè)高階函數(shù)(Higher Order function)作為對(duì)容器的支持。接下來(lái)我會(huì)介紹一下這三個(gè)函數(shù)的使用方法,算是對(duì)函數(shù)式編程的拋磚引玉,隨后會(huì)使用這三個(gè)函數(shù)來(lái)優(yōu)化一個(gè)計(jì)算文件夾大小的Demo。
map:轉(zhuǎn)換,可以對(duì)數(shù)組中的元素格式進(jìn)行轉(zhuǎn)換
//將Int數(shù)組轉(zhuǎn)換為String數(shù)組
//$0代表數(shù)組的元素
let array = [1, 2, 3, 4, 5 , 6, 7]
let result = array.map{
String($0)
}
filter:過(guò)濾,可以對(duì)數(shù)組中的元素按照某種規(guī)則進(jìn)行過(guò)濾
//在array中過(guò)濾出偶數(shù)
let result2 = array.filter{
$0 % 2 == 0
}
reduce:計(jì)算 ,可以對(duì)數(shù)組中的元素進(jìn)行計(jì)算
//計(jì)算數(shù)組array元素的和
//在這里$0和$1的意義不同,$0代表元素計(jì)算后的結(jié)果,$1代表元素
//10代表初始化值,在這里可以理解為 $0初始值 = 10
let result3 = array.reduce(10){
$0 + $1
}
這三個(gè)函數(shù)介紹完了,可以看到這三個(gè)方法使用起來(lái)非常的便利,接下來(lái)我會(huì)寫一個(gè)計(jì)算文件夾大小的Demo
之前我已經(jīng)在沙盒中創(chuàng)建了log文件夾,里邊存放了四個(gè)文件,我們要做的是計(jì)算出log文件夾下.pdf格式的文件大小。

先寫兩個(gè)方法分別獲取文件夾的路徑和計(jì)算一個(gè)文件的大小
//獲取文件夾路徑
func getFolderPath(folderName: String) -> String{
let path: NSString = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
return path.stringByAppendingPathComponent(folderName)
}
//計(jì)算一個(gè)文件的大小
func caculateFileSize(path: String) -> UInt64{
let fileManager = NSFileManager.defaultManager()
let dic: NSDictionary = try! fileManager.attributesOfItemAtPath(path)
let size = dic.fileSize()
return size
}
使用map,filter,reduce計(jì)算文件夾下.pdf格式文件大小
let folderPath = getFolderPath("log")
let childFiles = NSFileManager.defaultManager().subpathsAtPath(folderPath)
//使用filter過(guò)濾出.pdf格式的文件
//在map方法體中,將文件數(shù)組轉(zhuǎn)換為size的數(shù)組
//使用reduce計(jì)算size數(shù)組的和
//最終返回reduce的計(jì)算結(jié)果
let result = childFiles?.filter{
($0.componentsSeparatedByString(".")).last == "pdf"
}.map({ (fileName) -> UInt64 in
let filePath = folderPath + "/" + fileName
return caculateFileSize(filePath)
}) .reduce(0){
$0 + $1
}
print(".pdf文件大小總和為----\(result)")
計(jì)算結(jié)果:

在代碼中使用filter方法后直接調(diào)用了map方法,這是因?yàn)楦唠A函數(shù)支持鏈?zhǔn)秸{(diào)用,高階函數(shù)的特性就是可以以一個(gè)函數(shù)或多個(gè)函數(shù)當(dāng)參數(shù),返回值也可以是一個(gè)函數(shù),如果你使用過(guò)AutoLayout庫(kù) Masonry的話會(huì)很習(xí)慣這種寫法。
以上僅代表我的個(gè)人觀點(diǎn),有不足的地方希望大家隨時(shí)與我溝通