iOS成长路线西安iOS工作组swift 自我学习收集

Swift高阶函数map,filter,reduce实践

2016-03-09  本文已影响1348人  Lilin_Coder

Swift是一门面向协议的语言,在使用Swift时我们已经充分享受到了面向协议编程带给我们的便利,但是Swift相比Obj-C还有一个更重要的优点,那就是对函数式编程提供了很好的支持,其中Swift提供了map,filter,reduce这三个高阶函数(Higher Order function)作为对容器的支持。接下来我会介绍一下这三个函数的使用方法,算是对函数式编程的抛砖引玉,随后会使用这三个函数来优化一个计算文件夹大小的Demo。

map:转换,可以对数组中的元素格式进行转换

//将Int数组转换为String数组
//$0代表数组的元素
let array = [1, 2, 3, 4, 5 , 6, 7]
let result = array.map{
  String($0)
}

filter:过滤,可以对数组中的元素按照某种规则进行过滤

//在array中过滤出偶数
let result2 = array.filter{ 
  $0 % 2 == 0
}

reduce:计算 ,可以对数组中的元素进行计算

//计算数组array元素的和
//在这里$0和$1的意义不同,$0代表元素计算后的结果,$1代表元素
//10代表初始化值,在这里可以理解为 $0初始值 = 10
let result3 = array.reduce(10){  
  $0 + $1
}

这三个函数介绍完了,可以看到这三个方法使用起来非常的便利,接下来我会写一个计算文件夹大小的Demo
之前我已经在沙盒中创建了log文件夹,里边存放了四个文件,我们要做的是计算出log文件夹下.pdf格式的文件大小。

folder.png

先写两个方法分别获取文件夹的路径和计算一个文件的大小

//获取文件夹路径
func getFolderPath(folderName: String) -> String{
        let path: NSString = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
        return  path.stringByAppendingPathComponent(folderName)
}
//计算一个文件的大小
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计算文件夹下.pdf格式文件大小

  let folderPath = getFolderPath("log")
  let childFiles = NSFileManager.defaultManager().subpathsAtPath(folderPath)
  
  //使用filter过滤出.pdf格式的文件
  //在map方法体中,将文件数组转换为size的数组
  //使用reduce计算size数组的和
  //最终返回reduce的计算结果
  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)")

计算结果:


result.png

在代码中使用filter方法后直接调用了map方法,这是因为高阶函数支持链式调用,高阶函数的特性就是可以以一个函数或多个函数当参数,返回值也可以是一个函数,如果你使用过AutoLayout库 Masonry的话会很习惯这种写法。

以上仅代表我的个人观点,有不足的地方希望大家随时与我沟通

参考:
Swift 烧脑体操(三) - 高阶函数
Swift函数式编程实践

上一篇下一篇

猜你喜欢

热点阅读