how to use flatMap

如何使用flatMap

swift中实现了SequenceType接口的数据类型都可以通过for循环遍历其子集, 同时这些数据类型也都实现了flatMap方法,比如Rang,Array,Dictionary,Set等.

这里以Array举例,看看flatMap都做了些什么

        //一纬数组
        let myArray00:[Int] = [-1,1,2,100,88]
        let myArray01:[Int?] = [nil,1,nil,100,88]
        print("一纬数组:")
        print("myArray00\(myArray00)")
        print("myArray01\(myArray01)")
        
        //一维数组flatMap结果
        print("一维数组flatMap结果:")
        let resultMyArray00 = myArray00.flatMap {
            return $0
        }
        print("resultMyArray00:\(resultMyArray00)")
        let resultMyArray01 = myArray01.flatMap {
            return $0
        }
        print("resultMyArray01:\(resultMyArray01)")
        
        
        //二维数组
        print("二纬数组:")
        let myArray10:[[Int?]?] = [[-1,nil],nil,[nil,66],nil]
        let myArray11:[[Int?]] = [[-1,nil],[nil,66]]
        print("myArray00\(myArray00)")
        print("myArray01\(myArray01)")
        
        //二维数组flatMap结果
        print("二维数组flatMap结果:")
        let resultMyArray10 = myArray10.flatMap {
            return $0
        }
        print("resultMyArray10:\(resultMyArray10)")
        let resultMyArray11 = myArray11.flatMap {
            return $0
        }
        print("resultMyArray11:\(resultMyArray11)")

输出结果为:

	一纬数组:
	myArray00[-1, 1, 2, 100, 88]
	myArray01[nil, Optional(1), nil, Optional(100), Optional(88)]
	一维数组flatMap结果:
	resultMyArray00:[-1, 1, 2, 100, 88]//一纬数组不降纬,作用和map一样
	resultMyArray01:[1, 100, 88]//unwrapped并去掉nil值
	二纬数组:
	myArray00[-1, 1, 2, 100, 88]
	myArray01[nil, Optional(1), nil, Optional(100), Optional(88)]
	二维数组flatMap结果:
	resultMyArray10:[[Optional(-1), nil], [nil, Optional(66)]]//unwrapped并去掉nil值
	resultMyArray11:[Optional(-1), nil, nil, Optional(66)]//降纬,注意只关最外层纬度的值类型是否为Optional

可见:

1.对子集类型是Optional可选类型的时候,flatMap是把数组中的元素unwrapped,并去掉nil元素.只关心最外层纬度的值类型是否为Optional

2.对子集类型是非可选类型的时候,flatMap是把数组降纬

3.一纬数组不降纬,Natasha文章中提到的那篇文章Swift: What do map() and flatMap() really do?中介绍的Container的说法也许可以很好的解释一纬数组不降低纬度的原因.

4.对于一纬非可选类型的数组,flatMap的作用和map一样.

5.三维数组降纬是二纬数组,依此类推.