let a:String? = "opt"//可选类型 let arr = ["a","b",nil,a] //包含nil与可选 let map = arr.map{ $0 } let flatMap = arr.flatMap{ $0 } print(map) //[Optional("a"), Optional("b"), nil, Optional("opt")] print(flatMap) //["a", "b", "opt"] ->可选拆包,且nil被过滤掉
3.filter
遍历集合中的元素,将符合某个条件的元素组合成新的数组并返回。
对数组
1 2 3 4 5 6 7 8
//取集合中大于0的元素 let intArr = [0,1,2] let aArr = intArr.filter { value -> Bool in return value > 0 } let bArr = intArr.filter{ $0 > 0 } //尾随闭包的写法 print(aArr)//打印结果:[1, 2] print(bArr)//打印结果:[1, 2]
对字典
1 2 3 4 5 6 7 8
//取集合中大于0的元素 let dic0 = ["a":0,"b":1,"c":2] let dic1 = dic0.filter { (key: String, value: Int) in return value > 0 } let dic2 = dic0.filter { $0.value > 0 } //尾随闭包的写法 print(dic1)//打印结果:["c": 2, "b": 1] print(dic2)//打印结果:["c": 2, "b": 1]
4.reduce
遍历集合把所有元素组合起来,计算成一个新值并返回。reduce可接收一个初始值。
对数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
//计算所有元素的和 let numbers = [1,2,3,4] let sum0 = numbers.reduce(0) { (x,y) in //print("\(x),\(y)") return (x + y) } //初始值为1,计算元素的和 let sum1 = numbers.reduce(1) { $0+$1 } //尾随闭包的写法 print(sum0) //打印:10 print(sum1) //打印:11
//对于sum0,其计算过程为: 1.初始值为0,x为0,y为1 -> 返回 x + y 。所以初始值或者结果变为 1。 2.初始值或者结果变为 1,x为1,y为2 -> 返回 x + y 。所以初始值或者结果变为 3。 3.初始值或者结果变为 3,x为3,y为3 -> 返回 x + y 。所以初始值或者结果变为 6。 4.初始值或者结果变为 6,x为6,y为4 -> 返回 x + y 。所以初始值或者结果变为 10。
对字典
1 2 3 4 5 6 7 8 9 10 11 12 13
let dic0 = ["a":0,"b":1,"c":2,"d":4] let reduce = dic0.reduce(0) { (result, dic) in print("\(result),\(dic.key),\(dic.value)") return result + dic.value } print(reduce)//打印:7