Swift高阶函数介绍(闭包、Map、Filter、Reduce)
Swift语言有非常多函数式编程的特性。常见的map,reduce,filter都有,初看和python几乎相同,以下简介下
闭包介绍:
闭包是自包括的功能代码块,能够在代码中使用或者用来作为參数传值。
如果我们须要两个函数,当中一个计算两个数的平方的平均值,还有一个计算两个数的立方的平均值,传统的解决方法会是这样:
代码
func square(a:Float) -> Float { return a * a}func cube(a:Float) -> Float { return a * a * a}func averageSumOfSquares(a:Float,b:Float) -> Float { return (square(a) + square(b)) / 2.0}func averageSumOfCubes(a:Float,b:Float) -> Float { return (cube(a) + cube(b)) / 2.0}
我们注意到averageSumOfSquares和averageSumOfCubes的唯一不同仅仅是分别调用平方函数或立方函数。
如果我能够定义一个通用函数。这个函数以两个数和一个使用这两个数的函数作为參数,来计算平均值而不是反复调用将会非常好,我们能够使用闭包作为函数參数
代码
func averageOfFunction(a:Float,b:Float,f:(Float -> Float)) -> Float { return (f(a) + f(b)) / 2}averageOfFunction(3, 4, square)averageOfFunction(3, 4, cube)
在Swift中有非常多种定义闭包表达式的方法。这里从最啰嗦的開始展示到最简洁的为止:
代码
averageOfFunction(3, 4, {(x: Float) -> Float in return x * x})averageOfFunction(3, 4, {x in return x * x})averageOfFunction(3, 4, {x in x * x})averageOfFunction(3, 4, {$0 * $0})
Map
在Swift中Map是Array类的一个方法。我们能够使用它来对数组的每一个元素进行转换。
方法:func map(transform: (T) -> U) -> U[]
假如如今须要对一个Int数组进行字符串转换。那么就能够使用map方法:let intArray = [1,111,1111]//结果为["1","11","111"]let stringArray = intArray.map({ (intValue) -> String in return "\(intValue)"})
Filter
filter用于选择数组元素中满足某种条件的元素。
方法:filter(includeElement: (T) -> Bool) -> T[]
还是接着上面Map的代码继续写://结果[111,1111]let filterArray = intArray.filter { (intValue) -> Bool in return intValue > 30}
Reduce
reduce方法把数组元素组合计算为一个值。
方法:reduce(initial: U, combine: (U, T) -> U) -> U
代码接着上面写://结果1223let sum = intArray.reduce(0,combine: +)let sum2 = intArray.reduce(0) { (int, int2) -> Int in return int+int2}
Swift高阶函数介绍(闭包、Map、Filter、Reduce)的更多相关文章
- 高阶函数概念以及map/filter/reduce
什么样的函数叫高阶函数:map(func, *iterables) --> map object 条件:1.函数接受函数作为参数 2.函数的返回值中包含函数 num_l = [1,2,3,4,5 ...
- python 高阶函数学习, map、reduce
一个函数可以接收另一个函数作为参数,这样的函数叫做高阶函数. 函数map(): map()函数接收两个参数,一个是函数,一个是Iterable, map把函数作用于序列的每一个元素,并把结果作为Ite ...
- 【Python学习之六】高阶函数1(map、reduce、filter、sorted)
1.map map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回.示例: >>> def ...
- 【Python学习之六】高阶函数2(map、reduce、filter、sorted)
3.filter filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素.相当于一 ...
- 【重温基础】JS中的常用高阶函数介绍
Ps. 晚上加班到快十点,回来赶紧整理整理这篇文章,今天老大给我推荐了一篇文章,我从写技术博客中收获到了什么?- J_Knight_,感受也是很多,自己也需要慢慢养成记录博客的习惯,即使起步艰难,难以 ...
- 【Python】高阶函数介绍
其实函数可以作为变量,之前学过C++,对于这种用法并不奇怪.无非就是函数充当变量,可以传入函数而已. 下面分别介绍 Python 中常见的高阶函数:map/reduce, filter, sorted ...
- Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍
参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...
- 07 (H5*) js课程第8天 高阶函数、闭包、沙箱
目录: 1:call和apply方法调用 2:bind方法复制 3:函数中的几个属性值 4:高阶函数,函数作为参数 5:高阶函数,函数作为返回值. 6: 作用域链,作用域,预解析 7:闭包--延长 ...
- 函数高阶(函数,改变函数this指向,高阶函数,闭包,递归)
一.函数的定义方式 1.函数声明方式 function 关键字(命名函数) 2.函数表达式(匿名函数) 3.new Function( ) var fn = new Function(‘参数1 ...
随机推荐
- ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)
问题 F: (ds:图)旅游规划 时间限制: 1 Sec 内存限制: 128 MB 提交: 14 解决: 4 题目描述 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路 ...
- 深入浅出mysql全文随笔
进入mysql :mysql -uroot -p 1.DDL(Data Definition Languages)语句:数据定义语言 2.DML(Data Manipulation Language) ...
- redhat安装Xvfb
1.下载xvfb的rpm包进行安装 下载rpm安装包:http://rhn.redhat.com/errata/RHBA-2013-0083.html 安装rpm包:#rpm -ivh --nodep ...
- bzoj 1857 三分套三分
题目大意 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxh ...
- HDU1071 The area
Ignatius bought a land last week, but he didn't know the area of the land because the land is enclos ...
- java内部类的四大作用
一.定义 放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所 ...
- dedecms--后台添加会员栏目(批量添加)
最近在用dedecms二次开发会员功能,一开始做了一个会员添加,但是领导要求可以批量添加,最好是可以输入添加个数:这样我想添加几个就添加几个了 1:会员添加的htm页面 <html> &l ...
- Codeforces 622F The Sum of the k-th Powers(数论)
题目链接 The Sum of the k-th Powers 其实我也不懂为什么这么做的……看了无数题解觉得好厉害哇…… #include <bits/stdc++.h> using n ...
- codevs——2181 田忌赛马
2181 田忌赛马 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 中国古代的历史故事“田忌赛马”是为大 ...
- git history 记录(上传到 issu-170 )
一.上传到gitlab 本地issu-170落后git很多,发生冲突的要手动修改. 2000 cd robot_demo_0226_ws/ 2001 ls 2002 cd IGV01-SW-170 2 ...