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第五章(函数和闭包)相关推荐

  1. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  2. 【python第五章——函数】

    python第五章--函数 第五章--函数 5.1函数概述 5.2 函数进阶 下面部分之后再写 5.3函数习题(一些小例子) 第五章--函数 5.1函数概述 快速入门: #定义函数 def func( ...

  3. Swift 1.1语言第7章 函数和闭包

    Swift 1.1语言第7章  函数和闭包 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护.为了解决这个问题,人 ...

  4. 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. 第五章 函数和代码复用

    第五章 函数和代码复用 5.1 函数的基本使用 5.1.1 函数的定义 定义:函数是一段具有特定功能的.可重用的语句组,用函数名来表示并通过函数名进行功能调用. 使用函数的目的:降低编程难度和代码重用 ...

  6. 你不懂JS:作用域与闭包 第五章:作用域闭包

    希望我们是带着对作用域工作方式的健全,坚实的理解来到这里的. 我们将我们的注意力转向这个语言中一个重要到不可思议,但是一直难以捉摸的,几乎是神话般的 部分:闭包.如果你至此一直跟随着我们关于词法作用域 ...

  7. Scala入门到精通——第五节 函数与闭包

    本节主要内容 (一)函数字面量(值函数) (二)匿名函数 (三)函数的简化 (四)函数参数 (四)闭包 函数字面量(值函数) 函数字面量(function literal),也称值函数(functio ...

  8. 《 JavaScript程序设计》—— 第五章 函数

    5.1 黑盒 从概念上讲,函数接受输入,进行计算,然后产生输出.下图是一个函数黑盒示意图,它计算一个账户在t年之后的余额,其初始余额为p,年利率为r,每年取n次复利. 要使用这个函数,只需向函数发送四 ...

  9. python - 啃书 第五章 函数

    函数定义和调用 函数定义 函数是:组织好的,可重复使用的,用来实现单一或相关联功能的代码段. 在程序中,函数的使用能提高应用的模块性.代码的重用率和可读性. 自定义函数的一般格式为: def 函数名( ...

最新文章

  1. 微服务项目用了几台服务器,微服务部署运维
  2. VR/AR技术依然红火:何时迎来爆发点
  3. Python traceback 模块, 打印异常信息
  4. 微服务2017年度报告出炉:4大客户画像,15%传统企业已领跑
  5. python画图-python绘图篇
  6. SSM框架的简单搭建
  7. lstm 输入数据维度_LSTM 股票市场预测入门
  8. MySQL 高可用架构在业务层面的应用分析
  9. 如果今天完成,ESB会是什么样子?
  10. Python实现HTTP服务器(一)
  11. PAT乙级(1025 反转链表)
  12. RabbitMQ学习之队列监控
  13. Cmd下开启3389
  14. 正则表达式(思维导图速查版)
  15. 视频压缩工具FFmpeg的使用(中)
  16. Spring MVC如何配置OpenSessionInViewInterceptor并结合Hibernate使用
  17. 再谈KMP/BM算法(II)
  18. Northwind数据库下载地址
  19. IE无法浏览网页的常见原因及解决方法(转)
  20. 黑马程序员_Java基础_枚举 和 单例模式实例

热门文章

  1. matlab 读取图片后分区域编号_你的第一个有限元求解器——仅十行MATLAB代码
  2. Qt只有release
  3. mysql where非常规用法_MySQL where 条件的这个坑你碰到过没
  4. mysql查询当月数据_MySQL百万数据,你如何用分页来查询数据
  5. linux规定ip使用网卡,使用TC 对LINUX服务器网卡进行带宽限制的办法
  6. mysql错误码 1045_MySql错误代码1045的解决方法
  7. ubuntu16.04下安装windows软件,以及卸载.
  8. OSError: cannot identify image file
  9. Pytorch:函数的手动梯度计算方法
  10. 第一章 软件项目管理概述