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从入门到出家》的更多相关文章

  1. 10 结构体和类 - —— 《Swift3.0 从入门到出家》

    Swift中的面向对象5个要素:枚举.结构体.类.协议.扩展 面向对象研究的是对象,完成一件事情需要多个对象参与,是生活的映射 Swift中结构体和类非常相似,也就是结构体能完成类的所有功能.结构体是 ...

  2. 8 函数类型——《Swift3.0从入门到出家

    Swift语言中每一个函数都有它特定的数据类型,称其为函数类型 函数类型和基本数据类型一样,可以定义变量或者常量,可以定义函数形参,也可以做为函数的返回值类型 函数类型的格式为:参数列表的数据类型—& ...

  3. 7 函数——《Swift3.0从入门到出家

    6 函数 函数就是对某个功能的封装,一个swift程序可能由多个函数组成 swift中定义函数的格式: func 函数名称(参数列表) —>函数返回值类型{ 函数体 return } 函数定义要 ...

  4. 6 字典和集合——《Swift3.0从入门到出家》

    字典和集合 字典 字典是集合类型存放多个键值对,其中键是唯一的,不能重复 字典中存放的键值对是无序的,写入的顺序和读取的顺序可能不同 字典中存放的数据是任意类型 字典可以分为可变字典和不可变字典 创建 ...

  5. 5 数组 Swift/Object-C ——《Swift3.0从入门到出家》

    Swift中数组是一种数据结构,用来存放多个形同类型的数据结构,数据在数组内的存放是有序的,存进来的数据个读出来的顺序相同 Object-C 中数组能够存放任意类型的数据类型为[AnyObject] ...

  6. 4 字符串 Swift/Objective -C ——《Swift3.0从入门到出家》

    4 字符串   Swift and Object-C 字符串由多个字符组成,使用 “” 引起的内容 swift语言中提供了两种字符串:可变字符串和不可变字符串 可变字符串:字符串的内容可以修改,字符串 ...

  7. 3 循环语句——《Swift3.0从入门到出家》

    3 循环语句 当一段代码被多次重复利用的使用我们就使用循环 swift提供了三种形式的循环语句 1.while 循环 2.repeat — while 循环 3.for — in 循环 while 循 ...

  8. 2 分支语句——《Swift3.0 从入门到出家》

    2 分支语句 当程序面临多个选择,每一个选择都会执行不同的代码块,这个时候就要使用分支语句.常见的分支语句有: if 选择语句:if... if…else if…elseif…else if是现实生活 ...

  9. Swift3.0 函数闭包与OC Block

    刚接触Swift,如有不对的点,欢迎指正.转载请说明出处 定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> S ...

随机推荐

  1. Block作为返回值时的使用

    昨天使用一个小例子简单说明了下Block作为参数时的使用. 今天再来复习一下Block作为返回值使用时的情况,先贴一小段热门第三方框架Masonry的官方sample code: [view1 mas ...

  2. NOIP 数字游戏

    描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m ...

  3. JAVA基础补漏--多态

    Fu obj = new ZI(); 访问成员变量规则 编译看左,运行看左. obj.num; 1.直接通过对象名访问成员变量:看等号左右是谁,优先用谁,没有则往上找. obj.getnum(); 2 ...

  4. 获取微信公众号用户的基本信息(UnionID机制)

    获取用户基本信息(UnionID机制) 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的open ...

  5. how to get a controller instance in another controller

    https://stackoverflow.com/questions/16870413/how-to-call-another-controller-action-from-a-controller ...

  6. Caffe实现多标签输入,添加数据层(data layer)

    因为之前遇到了sequence learning问题(CRNN),里面涉及到一张图对应多个标签.Caffe源码本身是不支持多类标签数据的输入的. 如果之前习惯调用脚本create_imagenet.s ...

  7. DRBD分布式块设备复制

    一. DRBD介绍 1.1.数据镜像软件DRBD介绍分布式块设备复制(Distributed Relicated Block Deivce,DRBD),是一种基于软件.基于网络的块复制存储解决方案,主 ...

  8. CodeChef FORESTGA 二分

    Forest Gathering   Problem code: FORESTGA Tweet     ALL SUBMISSIONS All submissions for this problem ...

  9. 十二道MR习题 – 1 – 排序

    题目: 一个文件,大小约为100G.文件的每一行都是一个数字,要求对文件中的所有数字进行排序. 对于这个题目,了解过Hadoop的同学可以笑而不语了.即使用spark实现也是非常简单的事情. 先说下如 ...

  10. scala学习手记32 - trait选择性混入

    继续上一节. 狗当然是人类的好朋友.但是藏獒呢?这玩意儿又蠢又笨又凶狠,肯定不能算很多人的好朋友了.其实,刚才那句话还可以修正一下下:我们接受的狗才是我们的好朋友. 用程序怎么实现呢?在java里面, ...