Swift高阶函数

1.map

遍历集合并对每个元素执行相同的操作,从而将元素映射成新值并放在数组中返回,新值可以是原类型也可以是新的类型

  • 对数组
1
2
3
4
//将元素映射成string类型
let intArr = [0,1,2]
let newArr = intArr.map { "\($0)" }
print(newArr) //打印结果:["0", "1", "2"]
  • 对set
1
2
3
4
5
6
//将元素+1并映射成string类型
let intSet = [0,1,2]
let newSet = intSet.map { (e) -> String in
return "\(e+1)"
}
print(newSet) //打印结果:["1", "2", "3"]
  • 对字典
1
2
3
4
5
6
7
8
9
10
11
let dic = ["a":0,"b":1,"c":2]
//1.将value映射成string类型
let arr1 = dic.map { (key: String, value: Int) in
return [key,"\(value)"]
}
//2.取value并将其映射成string类型
let arr2 = dic.map { (key: String, value: Int) in
return "\(value)"
}
print(arr1) //打印结果:[["b", "1"], ["a", "0"], ["c", "2"]]
print(arr2) //打印结果:["2", "0", "1"]

2.flatMap

功能1:与map类似,遍历集合中的元素将其映射为新值并以数组形式返回。

1
2
3
4
5
let intAra = [0,1,2,3,4,5]
let r0 = intAra.map { $0+1}
let r1 = intAra.flatMap { $0+1}
print(r0) //打印:[1, 2, 3, 4, 5, 6]
print(r1) //打印:[1, 2, 3, 4, 5, 6]

功能2:flatMap能对多维数组进行降维,返回一维数组。

1
2
3
4
5
let lv2Arr = [[1,2,3],[4,5,6]];
var result0 = lv2Arr.map { $0.map{ $0 + 2 } }
var result1 = lv2Arr.flatMap { $0.map{ $0 + 2 } }
print(result0) //[[3, 4, 5], [6, 7, 8]] ->返回的还是二维数组
print(result1) //[3, 4, 5, 6, 7, 8] ->返回的是一维数组

功能3:对集合中的可选类型进行拆包,且只有拆包成功的元素才会在结果中返回。

1
2
3
4
5
6
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

//取消注释查看reduce的计算过程:
0,d,4
4,b,1
5,a,0
5,c,2
7

Swift高阶函数
https://davidlii.cn/2018/09/14/swift-map.html
作者
Davidli
发布于
2018年9月14日
许可协议