9 闭包——《Swift3.0从入门到出家》
8 闭包
Swift语言中可以使用一块独立代码块替代函数的定义,称独立的代码块为闭包
闭包格式为:
{(参数列表)->返回值类型 in
执行语句
}
例子:
<1>使用闭包实现两个数的和
var sum:(Int,Int) ->Int = {(a:Int, b:Int)->Int in return a + b}
<2>使用闭包实现一个整数和一个字符串的拼接,将拼接的结果返回
var append = {(num:Int,str:String) ->String in return “\(num)” + str}
<3>使用闭包实现数组升序排序(借用上节的排序函数)
sortArr(&array,method:{(num1:Int,num2:Int)->Bool in return num1 > num2})
当函数的形参是函数类型时,形参的传值直接使用闭包完成
<4>使用闭包获取数组中大于0的数据个数
let count = {(arr:[Int])->Int in
var n = 0
for i in arr{
if i > 0{
n += 1
}
}
return count
}
var array = [10,2,3,-3,3,-4]
print(count(array))
闭包的简化(closure)
<1>当执行语句只有一个表达式的时候 return可以省略
var closure = {(a:Int,b:Int)->Int in
a > b ? a : b
}
<2>当执行语句只有一个表达式而且表达式的结果类型可以推断出来,那么return关键字和返回值类型可以同时缺省
var closure = {(a:Int,bInt) in
a > b ? a : b
}
<3>当参数的类型已知,并且满足上述两个条件的时候,参数的名称可以缺省,参数的类型可以缺省,返回值类型可以缺省,return关键字可以缺省,in也可以缺省
var closure: (Int,Int)->Int = {$0 > $1 ? $0 : $1}
<4>当参数个数为两个,并且满足<3>的条件,闭包中直接添加运算符号就可以
sortArr(&array,method: <)
尾随闭包
当函数最后一个形参是函数类型的变量,对函数类型的变量赋值的时候需要使用闭包,那么闭包传值的书写位置可以放在所有参数列表之外,不放在参数列表的最后位置,我们称这种写法为尾随闭包
比如上节提到的排序可以写成:sortArr(&arr){$0 > $1}
例子:定义函数实现两个数的差和和
func sumAAndB(a:Int,b:Int,mehod:(Int,Int)->Int){
print(method(a,b))
}
sumAAndB(10,b:20,method:{(a:Int,b:Int)->Int in //初始写法
return a + b
})
sumAAndB(100,b:200,method: - ) //简化后的闭包
sumAAndB(0,b:10){$0 - $1} //写成尾随闭包
扩展
自动闭包: 函数的形参是函数类型 在函数类型的形参前添加@autoclosure 向该形参传递的闭包 就被称为自动闭包
自动闭包使用的条件:函数的参数列表为空 即()->返回值类型
//定义函数为数组赋值
func createArr(count: Int,@autoclosure function:()->Int)->[Int] {
//count 表示数组的元素个数
//function 一个函数类型的参数 在function指向的函数中对数组的每一个元素赋值 数组的元素都是Int类型 所以将赋的每一个值反馈回来 添加到新的数组中
var dataArr: [Int] = []
for _ in 0..<count {
dataArr.append(function())
}
return dataArr
}
print(createArr(5, function:Int(arc4random()) % 100))
自动闭包就是 编译器自动将表达式转化成闭包
9 闭包——《Swift3.0从入门到出家》的更多相关文章
- 10 结构体和类 - —— 《Swift3.0 从入门到出家》
Swift中的面向对象5个要素:枚举.结构体.类.协议.扩展 面向对象研究的是对象,完成一件事情需要多个对象参与,是生活的映射 Swift中结构体和类非常相似,也就是结构体能完成类的所有功能.结构体是 ...
- 8 函数类型——《Swift3.0从入门到出家
Swift语言中每一个函数都有它特定的数据类型,称其为函数类型 函数类型和基本数据类型一样,可以定义变量或者常量,可以定义函数形参,也可以做为函数的返回值类型 函数类型的格式为:参数列表的数据类型—& ...
- 7 函数——《Swift3.0从入门到出家
6 函数 函数就是对某个功能的封装,一个swift程序可能由多个函数组成 swift中定义函数的格式: func 函数名称(参数列表) —>函数返回值类型{ 函数体 return } 函数定义要 ...
- 6 字典和集合——《Swift3.0从入门到出家》
字典和集合 字典 字典是集合类型存放多个键值对,其中键是唯一的,不能重复 字典中存放的键值对是无序的,写入的顺序和读取的顺序可能不同 字典中存放的数据是任意类型 字典可以分为可变字典和不可变字典 创建 ...
- 5 数组 Swift/Object-C ——《Swift3.0从入门到出家》
Swift中数组是一种数据结构,用来存放多个形同类型的数据结构,数据在数组内的存放是有序的,存进来的数据个读出来的顺序相同 Object-C 中数组能够存放任意类型的数据类型为[AnyObject] ...
- 4 字符串 Swift/Objective -C ——《Swift3.0从入门到出家》
4 字符串 Swift and Object-C 字符串由多个字符组成,使用 “” 引起的内容 swift语言中提供了两种字符串:可变字符串和不可变字符串 可变字符串:字符串的内容可以修改,字符串 ...
- 3 循环语句——《Swift3.0从入门到出家》
3 循环语句 当一段代码被多次重复利用的使用我们就使用循环 swift提供了三种形式的循环语句 1.while 循环 2.repeat — while 循环 3.for — in 循环 while 循 ...
- 2 分支语句——《Swift3.0 从入门到出家》
2 分支语句 当程序面临多个选择,每一个选择都会执行不同的代码块,这个时候就要使用分支语句.常见的分支语句有: if 选择语句:if... if…else if…elseif…else if是现实生活 ...
- Swift3.0 函数闭包与OC Block
刚接触Swift,如有不对的点,欢迎指正.转载请说明出处 定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> S ...
随机推荐
- tinyxml优化之二
原文链接:http://www.cnblogs.com/zouzf/p/4216046.html tinyxml优化之一说到了效率在差别有三方面的原因:解析的方式.内存分配(字符串操作).冗余的安全性 ...
- [HAOI2007]反素数ant
1053: [HAOI2007]反素数ant Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1907 Solved: 1069[Submit][St ...
- SpringBoot AOP示例
AOP主要注解: @Aspect,作用在类上,说明这是一个Aspect切面类. @Pointcut,用来描述,你需要在哪些类的哪些方法中植入你的代码. @Adive,与Pointcut配合使用,主要说 ...
- NSwag Tutorial: Integrate the NSwag toolchain into your ASP.NET Web API project
https://blog.rsuter.com/nswag-tutorial-integrate-the-nswag-toolchain-into-your-asp-net-web-api-proje ...
- Graph_Master(连通分量_B_Trajan+完全图)
hdu_4635 题目大意:给出一张DAG(n个点,m条边),求出能加的最大边数,使得该图无重边,无自环,非强连通. 题解:这题题面很好理解,也没有什么很难的点,主要是如何求出最大边数需要动点脑筋.首 ...
- Java中遍历map的四种方法 - 转载
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- 查询相应的key
一.key pattern 查询相应的key (1)redis允许模糊查询key 有3个通配符 *.?.[] (2)randomkey:返回随机key (3)type key:返回key存储的类型 ...
- react-router路由
1.http://blog.csdn.net/sunshine215/article/details/78296404(react-router v4 使用 history 控制路由跳转) 2.htt ...
- 解决tomcat中jdk1.5运行日志相差8小时问题
tomcat运行日志时间与电脑中的时间相差8小时,原因是因为jdk1.5的原因: 解决办法是在jdk运行的时候加上默认参数: Window->Preferences->Java->I ...
- 【Hive】窗口函数
我们都知道在sql中有一类函数叫做聚合函数,例如sum().avg().max()等等, 这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的. 但是有时我们想要既显示 ...