playSwift第五章(函数和闭包)
1.函数
可变参数放最后,var参数只在函数内有效,函数形参默认let类型,inout参数地址传递。
函数新特性:
(1)函数可以通过返回元组实现返回多个参数,Void表示放回空元组。
函数类型的变量。
(2)函数可以作另一个函数的参数。
(3)函数可以作另一个函数的返回值,对于一个->表返回,后面的->表示返回值为一个函数。
//part1 //函数 func sayHello(name:String?)->String{//->String表示返回一个字符串类型let result = "hello,"+(name ?? "Guest")//当字符串为空时,name为guestreturn result; }var nickname:String?//声明一个可选型的字符串 println(sayHello(nickname))//part2 //通过元祖可以返回多个值 func maxminSores(score:[Int])->(maxscore:Int,minscore:Int)?{//返回一个可选值元祖if score.isEmpty{//当数组为空时return nil}var curmax = score[0],curmin = score[0]//初始化最大最小值为第一个数for score in score[1..<score.count]//1到count-1 {curmax = max(curmax, score)curmin = min(curmin, score)}return (curmax,curmin) }var userScores:[Int]? = [12,990,572,3258,9999,1204] userScores = userScores ?? []//当数组为空时userScores=[] if let (maxV,minV) = maxminSores(userScores!){ maxV minV }//part3 //保留oc特性中的外部参数名 //#表示外表参数名跟内部一致,定义函数允许赋予默认值,有默认值的参数要放在后面 func sayHi(userName name:String?,# greet:String,others:String=". how do you do")->String{//->String表示返回一个字符串类型let result = "\(greet),"+(name ?? "Guest")+others//当字符串为空时,name为guestreturn result; } sayHi(userName: "forr", greet: "hi") //part4 //设置可变参数others:Int... //函数的参数排序:先是必须的参数,再到带默认值的参数,最后是可变的参数 //函数中的参数默认是let不可变的,且属于值传递, func add(var a:Int,b:Int,others:Int...)->Int{var result = a+bfor num in others{result += num}a = 1000return result } var a = 2 var res = add(a,3, 4) a ////part4 //通过inout声明参数实现“址传递” func swapTwoInts(inout a:Int,inout b:Int){let t = aa = bb = t }var x = 0,y = 100 x yswapTwoInts(&x, &y) x y ////part5 //通过变量存在一个函数,此时给出变量的类型为:(Int,Int,Int...)->Int let anotherAdd:(Int,Int,Int...)->Int = add anotherAdd(6,3,1)func sayYes(){print("yes") } let anotherSayYes:()->() = sayYes sayYes() ////part6 //将一个函数用作另一个函数的参数,:(Int)->Int表示变量的类型是一个函数类型 func changeScores(op:(Int)->Int,inout scores:[Int]){for i in 0..<scores.count{scores[i] = op(scores[i])//调用函数op(scores[i]) } }func op1(x:Int)->Int{return Int(sqrt(Double(x))*10)} func op2(x:Int)->Int{return Int(Double(x)/150.0*100)} func op3(x:Int)->Int{return x + 3}var scores1 = [36,61,78,99] changeScores(op1 , &scores1)var scores2 = [88,101,124,137,150] changeScores(op2 , &scores2)var scores3 = [59,61,76,83,95] changeScores(op3 , &scores3)//使用系统sorted对数组降序 var arr = [Int]() for _ in 1...20{arr.append(Int(arc4random()%100)) } sorted(arr)func compareTwoInts(a:Int,b:Int)->Bool{return a>b//降序 } sorted(arr, compareTwoInts)//第二个参数传一个定义好降序规则的函数////part7函数式编程 //将一个函数用作另一个函数的返回值 func tier1MailFee(weight:Int)->Int{return 1*weight; }func tier2MailFee(weight:Int)->Int{return 2*weight; } //(Int)->Int表示返回值的类型是一个函数类型 func chooseMailFeeCalcMethod(weight:Int)->(Int)->Int{return (weight <= 10) ? tier1MailFee : tier2MailFee }func totalPrice(price:Int,weight:Int)->Int{let mailFeeCalc:(Int)->Int = chooseMailFeeCalcMethod(weight)//定义一个接收函数的变量return mailFeeCalc(weight) + price * weight//4+8 }totalPrice(2, 4) totalPrice(1, 12)//函数内可嵌套函数 //func totalPrice(price:Int,weight:Int)->Int{ // func chooseMailFeeCalcMethod(weight:Int)->(Int)->Int{ // return (weight <= 10) ? tier1MailFee : tier2MailFee // } // let mailFeeCalc:(Int)->Int = chooseMailFeeCalcMethod(weight)//定义一个接收函数的变量 // return mailFeeCalc(weight) + price * weight //}
2.闭包
嵌套函数,函数定义在函数体的内部。通过闭包可以对这种嵌套函数进行简化
//嵌套函数 func getMathFunc(#type:String)->(Int)->Int{func squre(num:Int)->Int{return num * num;}func cube(num:Int)->Int{return num * num * num;}switch(type){case "squre":return squre;default:return cube;} }var squre:(Int)->Int = getMathFunc(type: "squre");println(squre(4));
(1)闭包的格式: {函数的声明 in 方法的实现}
{(形参列表)->返回值类型 in
执行表达式
}
(2)闭包的各种简化形式
(3)闭包可以做一个函数的参数,最后一个参数为闭包时,可以写在函数外面(结尾闭包)。其格式: func 函数名(形参列表){函数的声明 in 方法的实现}
///part1闭包相当匿名函数 //闭包{(a:Int,b:Int)->Bool in return a>b} sorted(arr, {(a:Int,b:Int)->Bool in return a>b//in关键字 }) arrvar strArr = ["d","cd","bcd","abcd","abc","ab","a"] strArr = sorted(strArr, {(s1:String,s2:String)->Bool inif countElements(s1) != countElements(s2){return countElements(s1) < countElements(s2)//字母个数少的在前面 }return s1 < s2//升序 })sorted(arr,{a,b in return a>b})//简短版 sorted(arr,{$0 > $1})//降序,$0,$1表示第一二个参数 sorted(arr, >)//操作符作函数传入,该话题后续 ///part2 //结尾闭包trailing closure strArr = sorted(strArr) {(s1:String,s2:String)->Bool inif countElements(s1) != countElements(s2){return countElements(s1) < countElements(s2)//字母个数少的在前面 }return s1 < s2//升序 } //闭包内可以访问外边变量,后续相关的内存管理 var datas = [0,1,2,3,4,5,6,7,8,9,10] var num = 3 datas = sorted(datas){return fabs(CGFloat($0-num)) < fabs(CGFloat($1-num)) } ///part3 //函数和闭包都属于引用类型,其他数据类型属于值类型 func calcTotalMiles(todayMiles:Int)->()->Int{var totalMiles = 0//与一般函数中的变量差别很大,通常其他语言函数里定义的变量都是存放在栈区,调研函数后,定义的变量通通会销毁return {totalMiles += todayMiles;return totalMiles}//闭包 }var dailyTwoMiles = calcTotalMiles(2) dailyTwoMiles() dailyTwoMiles() dailyTwoMiles()var myPlan = dailyTwoMiles myPlan() dailyTwoMiles()
.
//闭包的简化形式 // var squre:(Int)->Int = {(num) in return num * num } // println(squre(4));// var squre:(Int)->Int = {num in return num * num } // println(squre(4));//省略形参名,通过$0、$1...来引用第一个、第二个参数var squre:(Int)->Int = {$0 * $0}println(squre(4));// var result:Int = {var result = 1;for i in 1...$1{result *= $0;}return result;}(4,3)//{}表示闭包 (,)表示调用println("\(result)")
转载于:https://www.cnblogs.com/huen/p/4295449.html
playSwift第五章(函数和闭包)相关推荐
- 《Go语言圣经》学习笔记 第五章函数
<Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...
- 【python第五章——函数】
python第五章--函数 第五章--函数 5.1函数概述 5.2 函数进阶 下面部分之后再写 5.3函数习题(一些小例子) 第五章--函数 5.1函数概述 快速入门: #定义函数 def func( ...
- Swift 1.1语言第7章 函数和闭包
Swift 1.1语言第7章 函数和闭包 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护.为了解决这个问题,人 ...
- stata:stata软件教程(人大十八讲)(5) 第五章 函数与运算符
第五章 函数与运算符 5.1 运算符 exp 5.1.1 代数运算 5.1.2 字符运算 5.1.3 关系运算 5.1.4 逻辑运算 5.2 函数概览 function 5.3 数学函数 5.3.1 ...
- 第五章 函数和代码复用
第五章 函数和代码复用 5.1 函数的基本使用 5.1.1 函数的定义 定义:函数是一段具有特定功能的.可重用的语句组,用函数名来表示并通过函数名进行功能调用. 使用函数的目的:降低编程难度和代码重用 ...
- 你不懂JS:作用域与闭包 第五章:作用域闭包
希望我们是带着对作用域工作方式的健全,坚实的理解来到这里的. 我们将我们的注意力转向这个语言中一个重要到不可思议,但是一直难以捉摸的,几乎是神话般的 部分:闭包.如果你至此一直跟随着我们关于词法作用域 ...
- Scala入门到精通——第五节 函数与闭包
本节主要内容 (一)函数字面量(值函数) (二)匿名函数 (三)函数的简化 (四)函数参数 (四)闭包 函数字面量(值函数) 函数字面量(function literal),也称值函数(functio ...
- 《 JavaScript程序设计》—— 第五章 函数
5.1 黑盒 从概念上讲,函数接受输入,进行计算,然后产生输出.下图是一个函数黑盒示意图,它计算一个账户在t年之后的余额,其初始余额为p,年利率为r,每年取n次复利. 要使用这个函数,只需向函数发送四 ...
- python - 啃书 第五章 函数
函数定义和调用 函数定义 函数是:组织好的,可重复使用的,用来实现单一或相关联功能的代码段. 在程序中,函数的使用能提高应用的模块性.代码的重用率和可读性. 自定义函数的一般格式为: def 函数名( ...
最新文章
- 微服务项目用了几台服务器,微服务部署运维
- VR/AR技术依然红火:何时迎来爆发点
- Python traceback 模块, 打印异常信息
- 微服务2017年度报告出炉:4大客户画像,15%传统企业已领跑
- python画图-python绘图篇
- SSM框架的简单搭建
- lstm 输入数据维度_LSTM 股票市场预测入门
- MySQL 高可用架构在业务层面的应用分析
- 如果今天完成,ESB会是什么样子?
- Python实现HTTP服务器(一)
- PAT乙级(1025 反转链表)
- RabbitMQ学习之队列监控
- Cmd下开启3389
- 正则表达式(思维导图速查版)
- 视频压缩工具FFmpeg的使用(中)
- Spring MVC如何配置OpenSessionInViewInterceptor并结合Hibernate使用
- 再谈KMP/BM算法(II)
- Northwind数据库下载地址
- IE无法浏览网页的常见原因及解决方法(转)
- 黑马程序员_Java基础_枚举 和 单例模式实例
热门文章
- matlab 读取图片后分区域编号_你的第一个有限元求解器——仅十行MATLAB代码
- Qt只有release
- mysql where非常规用法_MySQL where 条件的这个坑你碰到过没
- mysql查询当月数据_MySQL百万数据,你如何用分页来查询数据
- linux规定ip使用网卡,使用TC 对LINUX服务器网卡进行带宽限制的办法
- mysql错误码 1045_MySql错误代码1045的解决方法
- ubuntu16.04下安装windows软件,以及卸载.
- OSError: cannot identify image file
- Pytorch:函数的手动梯度计算方法
- 第一章 软件项目管理概述