博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你需要知道的swift必备函数 map
阅读量:4583 次
发布时间:2019-06-09

本文共 2480 字,大约阅读时间需要 8 分钟。

map这东西在oc中并未用过,但是swift在处理数组的时候显得格外的游刃有余,这归功于map这个函数;

map函数  arr.map(<#T##transform: (Int) throws -> T##(Int) throws -> T#>) 其获取一个闭包表达式作为唯一参数,集合中的每个元素调用一次该闭包函数,并返回该元素所映射的值(也可以是不同类型的值)。具体的映射方式和返回值类型由闭包来指定。

关于map,swift开发者大会唐巧有一片关于Monat的演讲,对map的解释笔者觉得很精髓,map就是把一个盒子拆开,取出盒子里面的元素,把盒子里面的元素进行一系列的运算,然后再放回盒子的这么个过程。

下面举出一个map函数的执行实例:

//map 方法         let array = [1,2,3,4]        let newArray = array.map { (element:Int) -> String in            let string = String.init(format: "%d", element)            return string        }            print(newArray)        let newArray2 = array.map({            "\($0+10)"        })        print(newArray2)

 element代表数组中的每一个元素,Int是初始类型 ,String是要转换的类型,in后是操作方法  newArrray返回一个元素是4个字符串的数组["1","2","3","4"];

下面的方法是闭包的形式对数组进行操作,对数组中的每一个元素➕10然后转换成字符串;希望各位先去理解下闭包;

 

 


 

 flatmap函数

说到map函数,自然要谈一下flatmap,flatmap和map函数基本类似,但是存在着其他的区别;

map 可以对一个集合类型的所有元素做一个映射操作。 那么 flatMap 呢?

let numbers = [1 ,2, 3]let resultMap = numbers.map({$0 + 2})print(resultMap)//[3, 4, 5]let result = numbers.flatMap { $0 + 2 }		print(result)//[3, 4, 5]

 可见,我对numbers进行map和flatmap操作返回的值是一模一样的,也就是说flatmap同样对数组进行了映射操作,但是区别到底在哪里呢? 

let numbers2 = [[1 ,2, 3],[4 , 5 ,6]]let resultMap2 = numbers2.map({$0.map({$0 + 2})})print(resultMap2)//[[3, 4, 5], [6, 7, 8]]let resultFlatmap2 = numbers2.flatMap({$0.map({$0 + 2})})print(resultFlatmap2)//[3, 4, 5, 6, 7, 8]

可见, flatMap 依然会遍历数组的元素,并对这些元素执行闭包中定义的操作。 但唯一不同的是,它对最终的结果进行了所谓的 “降维” 操作。 本来原始数组是一个二维的, 但经过 flatMap 之后,它变成一维的了。

具体的原理可以去查询一下flatmap的定义,flatmap函数有连个重载,并且通过result.append(contentsOf:)将结果元素添加到了新的数组中,成为了一个一维数组;

 

flatMap 的另一个重载

我们来看一个例子:   

let optionalArray: [String?] = ["AA", nil, "BB", "CC"];var optionalResult = optionalArray.flatMap{ $0 }print(optionalResult)// ["AA", "BB", "CC"]

这样竟然没有报错, 并且 flatMap 的返回结果中, 成功的将原数组中的 nil 值过滤掉了。 再仔细观察,你会发现更多。 使用 flatMap 调用之后, 数组中的所有元素都被解包了, 如果同样使用 print 函数输出原始数组的话, 会得到这样的结果:

let optionalArray: [String?] = ["AA", nil, "BB", "CC"];var optionalResult = optionalArray.flatMap{ $0 }print(optionalResult)// ["AA", "BB", "CC"]print(optionalArray) //[Optional("AA"), nil, Optional("BB"), Optional("CC")]

也就是说原始数组的类型是 [String?] 而 flatMap 调用后变成了 [String]。 这也是 flatMap 和 map 的一个重大区别。 如果同样的数组,我们使用 map 来调用, 得到的是这样的输出:
[Optional("AA"), nil, Optional("BB"), Optional("CC")]
这就和原始数组一样了。 这两者的区别就是这样。 map 函数值对元素进行变换操作。 但不会对数组的结构造成影响。 而 flatMap 会影响数组的结构。再进一步分析之前,我们暂且这样理解。
flatMap 的这种机制,而已帮助我们方便的对数据进行验证,比如我们有一组图片文件名, 我们可以使用 flatMap 将无效的图片过滤掉:
究竟flatmap是如何过滤掉nil的呢?感兴趣的还是自己去查吧

 

转载于:https://www.cnblogs.com/lidarui/p/5983472.html

你可能感兴趣的文章
LINUX安装NGINX
查看>>
服务器启动项目抛错 没有到主机的路由
查看>>
python_85_sys模块
查看>>
第九周动手动脑
查看>>
HDU 1811 Rank of Tetris
查看>>
winform 获取当前名称
查看>>
MyBatis笔记一:GettingStart
查看>>
查找不同的木棍
查看>>
面试题:顺时针打印矩阵
查看>>
DataSet、DataTable、DataRow、DataColumn区别及使用实例
查看>>
python 特殊方法
查看>>
Python3 练习笔记四
查看>>
装箱问题
查看>>
Android线程管理(一)——线程通信
查看>>
vim 使用技巧
查看>>
面向对象的特征有哪些方面?
查看>>
三月十一号
查看>>
国外免费空间
查看>>
构建linux内核树
查看>>
Linux C 信号处理
查看>>