• 你需要知道的swift必备函数 map


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

  • 相关阅读:
    Mysql 密码过期
    【Linux】 设置Linux的系统时间
    【Ubantu】ubantu 安装 .net core 3.0 的环境
    【Ubantu】Ubantu的常用命令
    【SQL】一个简单的查询所有层级(直到顶层)的sql语句
    【C++】C++中的异常解析
    【C++】C++中的类模板
    【Eclipse】Eclipse如何导出java项目为jar包
    【Kali】kali linux的安装和配置
    【Python】解析Python中的线程与进程
  • 原文地址:https://www.cnblogs.com/lidarui/p/5983472.html
Copyright © 2020-2023  润新知