Swift高階函數(shù)map,filter,reduce實(shí)踐

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格式的文件大小。

folder.png

先寫兩個(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é)果:


result.png

在代碼中使用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í)與我溝通

參考:
Swift 燒腦體操(三) - 高階函數(shù)
Swift函數(shù)式編程實(shí)踐

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容