您的位置:首页 > 移动开发 > Swift

Swift语法-高阶函数

2017-12-01 14:37 246 查看
     高阶函数map,flatMap,reduce,filter可以简化代码量, 能用就用。

1、 map函数, 是集合和String类的实例方法, 作用是遍历时修改item;map并不会修改实例值, 而且新建一个拷贝。

摘自官方文档:

let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercased() }
// 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
let letterCounts = cast.map { $0.count }
// 'letterCounts' == [6, 6, 3, 4]


再举2个例子说明:

1、将Int数组转换为String数组, 即map支持转换数组参数类型;
2、偶数乘以10,测试遍历时添加自定义逻辑;

let array = [1, 2, 3]
let str1 = array.map({ "$\($0)"}) //数组每个元素转成String类型
let str2 = array.map{ param -> Int in   //遍历时可以添加条件判断逻辑
if param%2 == 0 {
return param * 10  //偶数乘以10
} else {
return param
}
}
print(array) //[1 2 3]
print(str1)  //[“$1","$2","$3"]
print(str2)  //[1,20,3]


2、flatMap, 功能跟map类似; 区别是flatMap会过滤nil元素, 并解包Optional。

示例:



      arr1包含5个值, arr4包含4个值。

      

      flatMap还可以将多维数组转换为一维数组;



     对于N维数组, map函数仍然返回N维数组。 


    PS: arr数组里包含3个元素, map循环了4次。

3、 filter函数, 顾名思义就是过滤出符合条件的元素。



4、reduce函数, 它可以使用2个参数即$0和$1, 而前3个函数只能使用一个参数$0。

     reduce可以实现求和, 或筛选出符合条件记录计算总和。



高阶函数还可以链式使用(多级):

let array = [1, 2, 3, 4, 5]
let sum0 = array.filter{ $0 > 2}.reduce(0, +)
print(sum0)  //12
     求数组里大于2的值之和。

组合调用:

      找出二维数组中所有的偶数。

let array = [[1,2,3], [4,5,6], [7,8,9] ]
let even = array.flatMap {
$0.filter { $0%2 == 0}
}
print(even)  //[2,4,6,8]

       如果使用基本二维数组遍历的语法就比较麻烦了:

//基本的二维数组遍历
var evenArr = [Int]()
for arr in array {
for item in arr {
if item % 2 == 0 {
evenArr.append(item)
}
}
}
print(evenArr)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: