swift函数式编程-函数基础
来源:互联网 发布:sql获取当前时间 编辑:程序博客网 时间:2024/05/19 22:49
swift的函数式编程比较灵活,主要有函数,闭包(objective-c中的block),协议,扩展,泛型,可空链等等,下面就逐个解释。
一:函数
函数是函数式编程的基础和一部分,函数类似于其他的语言,例如Java,objective-c,都是由函数名,参数,返回值,函数体组成,只是在写法上有细微的区别。
1.1函数的定义
func isInclude(isInclude:String,inArray:Array<String>)->Bool{//函数定义 for item in inArray{ if isInclude == item{ return true } } return false}isInclude("0", inArray: ["1","2","3"])
1.2外部参数名(即在调用函数的时候,显示参数名)
func isInclude(target isInclude:String,strings inArray:Array<String?>)->Bool{ for item in inArray{ if item == isInclude{ return true } } return false}isInclude(target: "1", strings: ["1","2","3"])//调用函数的时候,显示参数名target和strings.
1.3 参数默认值(即给函数的参数赋予默认的值)
func isInclude2(target isInclude:String="a",strings inArray:Array<String>)->Bool{ for item in inArray{ if item == isInclude{ return true } } return false}isInclude2(target: "2", strings: ["1","2","3"])//参数虽然有默认值,但是仍然重新赋值isInclude2(strings: ["a","b","c"])//参数不重新赋值,用默认值,即target是默认的字符串"a"
1.4变量参数(参数值是变量,即参数是可以改变的)
func sum(var firstValue:Double,values:Double...)->Double{//参数默认是常量let,除非用var标识,才是变量 for item in values{ firstValue += item//参数在函数内部可以改变 } return firstValue}sum(2, values: 1,2,3)
1.5输入/输出参数(即在函数内部可以修改外部变量的值,其实质是指针的传递,而不是值传递),一般情况下都是值传递,即函数内部不能改变函数外部的值。但是输入输出参数是指针传递,内部是可以修改外部值的。
func sum2(inout firstValue:Double,values:Double...)->Double{//输入输出参数要inout作为标识。 for item in values{ firstValue += item } return firstValue}var firstValue = 5.0sum2(&firstValue, values: 1,2,3)//传递的是指针print(firstValue)//外部的参数值已经被改变,此时打印的是11sum2(&firstValue, values: 1,2,3)//可以看出参数值已经在前一个函数中被改变,此时打印的结果是17
1.5函数本身作为参数
func max(bigger:(Double,Double)->Double,values:Double...)->Double{//max函数有一个函数参数,这个函数参数的格式是(Double,Double)->Double。任何符合这个格式的函数(或者是闭包)都可以作为参数 var maxValue = values[0] for var i=0;i<values.count;++i{ maxValue = bigger(maxValue,values[i]) } return maxValue }func bigger2(firstValue:Double,secondValue:Double)->Double{//符合上面的参数格式 return firstValue>secondValue ? firstValue : secondValue}func bigger(firstValue:Double)->Double{//不符合上面参数的格式 return 0}max(bigger2, values: 1,2,3)//返回值是3,验证正确
//降序func desc(values:Double...)->[Double]{//定义一个降序方法 var results = values for var i = 0;i < values.count;++i{ for var j = i+1;j < values.count;++j{ if results[j]>results[i]{ let temp = results[j] results[j] = results[i] results[i] = temp } } } return results}//升序func asc(values:Double...)->[Double]{//定义一个升序方法 var results = values for var i = 0;i < results.count;++i{ for var j = i + 1; j < results.count; ++j{ if (results[i]>results[j]){ let temp = results[i] results[i] = results[j] results[j] = temp } } } return results }func sort(orderType:Int)->((values:Double...)->[Double]){//定义一个选择哪个函数的方法,返回的函数必须遵从(values:Double...)->[Double]这个形式 return orderType == 0 ? asc : desc// asc和desc函数必须遵从上面参数和返回值的形式}//升序var sortFunc = sort(0)//返回的值是一个升序函数sortFunc(values: 1,4,2,6,3)//调用这个返回的函数//降序sortFunc = sort(1)//返回一个降序函数sortFunc(values: 1,4,2,6,3)// 调用这个返回的降序函数
1.7嵌套函数(其本质也是闭包)
func sortFunc(orderType:Int,values:Double...)->[Double]{ func asc(values:[Double])->[Double]{//嵌套的第一个函数,升序。必须调用的时候,这个函数才会执行,否则不会执行。参数不能是区间,要是数组。 var results = values for var i = 0;i < results.count;++i{ for var j = i + 1; j < results.count; ++j{ if (results[i]>results[j]){ let temp = results[i] results[i] = results[j] results[j] = temp } } } return results } func desc(values:[Double])->[Double]{//嵌套的第二个函数,降序 var results = values for var i = 0;i < values.count;++i{ for var j = i+1;j < values.count;++j{ if results[j]>results[i]{ let temp = results[j] results[j] = results[i] results[i] = temp } } } return results } return orderType == 0 ? asc(values) : desc(values)//values在这里会被自动转换成数组,而不是区间!!!,所以上面2个函数的参数是数组,而不是区间!!}sortFunc(0, values: 5,2,4,1,6,4)
1 0
- swift函数式编程-函数基础
- iOS编程基础-Swift(二)-函数
- [Swift]Swift的函数式编程
- Swift的函数式编程( ) -> ( )
- Swift函数式编程API
- Swift函数式编程:Optional
- Swift 的函数式编程
- Swift 的函数式编程
- Swift 基础学习(函数)
- 【swift基础】07函数
- Swift基础 函数
- Swift基础 构造函数
- 函数式编程基础
- Swift基础-0006 【swift函数调用】
- Swift基础语法: 22 - Swift的函数类型, 嵌套函数
- Python编程基础之十函数和函数式编程
- 网络编程基础函数
- shell编程基础------函数
- 统计学习笔记(1)——统计学习方法概论
- 工厂方法模式
- iOS NSNotificationCenter详解
- Server Tomcat v7.0 Server at localhost failed to start.
- 2叉树遍历的递归实现-使用c++模板
- swift函数式编程-函数基础
- Android Studio中文字体显示乱码
- class_create() and device_create()
- 《Effective java》读书记录-第13条-使类和成员的可访问性最小化
- 统计学习笔记(2)——感知机模型
- 无定位父元素时offsetParent为body,但是offsetTop/offsetLeft计算距离从html开始
- 在Android中使用OpenGL效果渲染
- 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决
- 对JavaEE中session的理解