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的呢?感兴趣的还是自己去查吧

你需要知道的swift必备函数 map的更多相关文章

  1. 对于JavaScript的函数.NET开发人员应该知道的11件事

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天小感冒今天重感冒,也不能长篇大论.如果你是.NET开发人员,在进入前端开发领域的时候,对 ...

  2. 很少有人知道的c++中的try块函数

    c++有一些在现实世界中很少看到的结构.这些结构有着自己的用法,但是要特别小心保守的予以运用.就像是网站 The Old New Thing首页标题上面的说的那样: “代码通常被读的次数原因超过了被写 ...

  3. swift中高阶函数map、flatMap、filter、reduce

    Swift相比于Objective-C又一个重要的优点,它对函数式编程提供了很好的支持,Swift提供了map.filter.reduce这三个高阶函数作为对容器的支持. 1 map:可以对数组中的每 ...

  4. 那些必须要知道的Javascript

    原文:那些必须要知道的Javascript JavaScript是前端必备,而这其中的精髓也太多太多,最近在温习的时候发现有些东西比较容易忽略,这里记录一下,一方面是希望自己在平时应用的时候能够得心应 ...

  5. 关于WPF你应该知道的2000件事

    原文 关于WPF你应该知道的2000件事 以下列出了迄今为止为WPF博客所知的2,000件事所创建的所有帖子. 帖子总数= 1,201 动画 #7 - 基于属性的动画 #686 - 使用动画制作图像脉 ...

  6. [技术翻译]您应该知道的13个有用的JavaScript数组技巧

    本次预计翻译三篇文章如下: 01.[译]9个可以让你在2020年成为前端专家的项目 02.[译]预加载响应式图像,从Chrome 73开始实现 03.[译]您应该知道的13个有用的JavaScript ...

  7. 每个JavaScript开发人员应该知道的33个概念

    每个JavaScript开发人员应该知道的33个概念 介绍 创建此存储库的目的是帮助开发人员在JavaScript中掌握他们的概念.这不是一项要求,而是未来研究的指南.它基于Stephen Curti ...

  8. 关于Java高并发编程你需要知道的“升段攻略”

    关于Java高并发编程你需要知道的"升段攻略" 基础 Thread对象调用start()方法包含的步骤 通过jvm告诉操作系统创建Thread 操作系统开辟内存并使用Windows ...

  9. 【转载】在IT界取得成功应该知道的10件事

     在IT界取得成功应该知道的10件事 2011-08-11 13:31:30 分类: 项目管理 导读:前面大多数文章都是Jack Wallen写的,这是他的新作,看来要成为NB程序员还要不停的自我总结 ...

随机推荐

  1. Android启动模式(三种)

    1,标准启动模式 通过任务栈,每点一次button,将每一个实例都压入,然后点返回键时候,就弹出之前压入的实例. 每一次的地址都是不同的 测试代码:通过创建一个button和textView来显示本身 ...

  2. 多比(SVG/VML)图形控件多比(SVG/VML)图形拓扑图控件免费下载地址

    多比图形控件是一款基于Web(VML和SVG技术)的矢量图形控件, 类似于网页上的Visio控件拓扑图软件,是目前国内外最佳的基于web的工作流设计器.工作流流程监视器解决方案. 可广泛应用于包括:电 ...

  3. 传智播客JavaWeb day03

    ServletContext 这堂课主要讲ServletContext这个web域(可以看得见范围的)对象,web在启动的时候会创建唯一的ServletContext域对象. 作用:1.用来web域共 ...

  4. Day18_集合第四天

    1.Map集合成员方法(掌握) 增加功能 V put(K key, V value) 当key在集合中不存在时,添加元素:当key在集合存在时候,替换元素 删除功能 void clear 清除所有键值 ...

  5. Python 手写数字识别-knn算法应用

    在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点 ...

  6. sqlserver OpenRowSet 对应的三种数据库驱动

    在使用sqlserver数据库的OpenRowSet函数时,会遇到三种驱动方式: 1. MSDASQL驱动SELECT TOP 10 * FROM OPENROWSET('MSDASQL', 'DRI ...

  7. vector的应用

    1.0基本操作 (1)头文件: #include<vector>; (2)创建: vector<int>vec, vector<double>vec, vector ...

  8. Oracle学习系列7

    Oracle学习系列7 ************************************************************************************ 关联表 ...

  9. SPOJ QTREE Query on a tree

    题意:给一颗n个点的树,有两种操作CHANGE i ti : 把第i条边的权变为tiQUERY a b : 问点a 到 点b 之间的边的最大权 思路:树剖处理边权.由于是边,所以只需要把边权处理到子节 ...

  10. windows多线程相关

    1.多线程同步的方法 a)entercirticalsection leaveciriticalsection b)Mutex互斥对象 waitforsingleobject releasemutex ...