Swift数组高阶函数

开发语言:Swift 4.2
开发环境:Xcode 10.1

Swift 提供了以下几种高阶函数,用以进行数组转换。

1、Sequence.map

遍历原数组,并使用闭包提供的方法对集合的子项进行转换,生成新的数组,例如

1.1、[Int]转换为[String]

 let test = [1,2,3,4,5]
 let result = test.map({ (value) -> String in
            return value.string
        })
 print(result)

输出:["1", "2", "3", "4", "5"]

1.2、[Int]转换为[[String]]

let test = [1,2,3,4,5]
let result = test.map({ (value) -> [String] in
            return [value.string, (value * 5).string]
        })
print(result)

输出:[["1", "5"], ["2", "10"], ["3", "15"], ["4", "20"], ["5", "25"]]

2、Sequence.flatMap

遍历原数组,生成二维数组,最后降维 或 遍历原数组,过滤非空

2.1、[Int]转换为[String](将1.2的二维数组降维成一维数组)

let test = [1,2,3,4,5]
let result = test.flatMap({ (value) -> [String] in
            return [value.string, (value * 5).string]
        })
print(result)

输出:["1", "5", "2", "10", "3", "15", "4", "20", "5", "25"]

2.2、[Int?]转换为[String](过滤非空)

let test = [1,2,3,4,5,nil]
let result = test.flatMap({ (value) -> String? in
            guard let noNil = value else {
                return nil
            }
            return noNil.string
        })
print(result)

输出:["1", "2", "3", "4", "5"]

2.3、 问题:如果想同时降维与过滤非空会怎样?

let test = [1,2,3,4,5,nil]
let result = test.flatMap({ (value) -> [String]? in
            guard let noNil = value else {
                return nil
            }
            return [noNil.string, (noNil * 5).string]
        })
print(result)

输出:[["1", "5"], ["2", "10"], ["3", "15"], ["4", "20"], ["5", "25"]]

  • 此时并没有执行任何降维的操作,事实上在同时有降维和过滤非空的情况下,flatMap只会执行过滤非空的操作
  • 在Swift4.1中,为了不让使用者混淆这两种flatMap的使用情况,引入了新的函数compactMap

3、Sequence.compactMap

遍历原数组,过滤非空

3.1、[Int?]转换为[String](过滤非空)

let test = [1,2,3,4,5,nil]
let result = test.compactMap({ (value) -> String? in
            guard let noNil = value else {
                return nil
            }
            return noNil.string
        })
print(result)

输出:["1", "2", "3", "4", "5"]

3.2、[Int]转换为[[String]](无法降维)

let test = [1,2,3,4,5]
let result = test.compactMap({ (value) -> [String] in
            return [value.string, (value * 5).string]
        })
print(result)

输出:[["1", "5"], ["2", "10"], ["3", "15"], ["4", "20"], ["5", "25"]]

4、Sequence.reduce

指定一个初始值,遍历原数组,通过闭包的计算将数组元素叠加到初始值上

let test = [1,2,3,4,5]
let result = test.reduce("begin") { (res, value) -> String in
            return res + " " + value.string
        }
print(result)

输出:begin 1 2 3 4 5

5、Sequence.filter

遍历原数组,过滤掉不符合闭包的元素

let test = [1,2,3,4,5]
let result = test.filter { (value) -> Bool in
            return value % 2 == 0
        }
print(result)

输出:[2, 4]

6、Sequence.contains

遍历原数组,判断是否包含符合闭包条件的元素

let test = [1,2,3,4,5]
let result = test.contains { (value) -> Bool in
            return value == 5
        }
print(result)

输出:true

7、Sequence.first

遍历原数组,返回第一个符合闭包条件的元素可选值

let test = [2,4,6,8,10]
let result = test.first { (value) -> Bool in
            return value == 6
        }
print(result)

输出:Optional(6)

8、Sequence.firstIndex

遍历原数组,返回第一个符合闭包条件的元素的下标可选值

let test = [2,4,6,8,10]
let result = test.firstIndex { (value) -> Bool in
            return value == 6
        }
print(result)

输出:Optional(2)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,740评论 0 38
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 9,442评论 1 10
  • 1.今日学习:郑多燕减肥操四十分钟;完成了1小时的英语听力;数字联接半小时,数字读数20分钟。背诵单词60; 2....
    谭丽阅读 1,176评论 0 0
  • 定义:git是目前世界上最先进的分布式版本控制系统,主要用于团队开发的版本控制。通过git可以实现多人协作,工作文...
    小张同学_loveZY阅读 1,833评论 0 0
  • 2017年春节前一天,从沈阳陪母亲看完病后打车回家过春节。 现在还有下大雪的时节真是喜从天降,尽管天寒地冻,路滑危...
    华客鲁俊阅读 3,704评论 2 4