swift学习记录(闭包)
2015-12-18 10:09
295 查看
闭包是可以在代码中传递和使用的自包含的功能模块。可以捕获和存储上下文任何引用常量和变量,也就是关闭这些常量和变量,因此得名“闭包。相当于java
中的匿名内部类、OC中的block。
可以作为表达式、函数参数和函数返回值,闭包表达式的运算结果是一种函数类型。
闭包表达式语法:
{(参数列表)->返回值类型 in
语句组
}
闭包的参数可以使用 常量 、变量、元组和输入输出参数(inout),不提供默认值,参数列表中的最后一个参数,也可以使用可变参数。
in 关键字 引入内联闭包的函数体,表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。
多返回值,可以借助元组。
闭包作为函数参数的事例:
闭包的简化方式:
1,类型推断简化
因为 Swift 可以推断出闭包的参数和返回值类型,所以不需要完整格式构造内联闭包。
上面的闭包就可以简写为:
如果 闭包内只有一条 return 语句时,可以省略return 关键字,所以上面的闭包还可以在简化为:
3,参数名缩写
Swift 为内联函数提供了参数名称缩写功能,通过 $0,$1,$2 顺序使用闭包的参数。
如果使用了参数缩写名称,在函数参数列表中可以省略对闭包的定义,Swift 也会推断闭包参数缩写名称的类型。 in 关键字同样被省略。此时闭包表达式完全由闭包函数体构成。上面的闭包再简化为:
使用闭包的返回值:
闭包表达式的运算结果是函数类型,是有返回值的,所以我们可以直接使用它的返回值
尾随闭包
闭包作为函数的参数,而且闭包表达式有很长的情况下,调用函数时,代码的可读性就变的很差,为了增强代码的可读性,这里就需要用到 尾随闭包。就是将闭包写在参数列表括号的后面。
需要注意的是,闭包必须是函数参数列表的最后一个参数。
使用尾随闭包调用上面的 getArr 函数
中的匿名内部类、OC中的block。
可以作为表达式、函数参数和函数返回值,闭包表达式的运算结果是一种函数类型。
闭包表达式语法:
{(参数列表)->返回值类型 in
语句组
}
闭包的参数可以使用 常量 、变量、元组和输入输出参数(inout),不提供默认值,参数列表中的最后一个参数,也可以使用可变参数。
in 关键字 引入内联闭包的函数体,表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。
多返回值,可以借助元组。
闭包作为函数参数的事例:
/** 参数1:Int 数组 参数2:是一个函数类型的参数 返回值:Int 数组 */ func getArr(arr:[Int] , pre:(Int)->Bool) ->[Int]{ //定义一个空的可变整形集合 var tempArr = [Int]() for temp in arr { if pre(temp){ tempArr += [temp] } } return tempArr; } /**** 调用函数 ******/ //定义int数组 var intArr = [0,1,2,3,4,5,6] /**调用 getArr 函数 ,其中第二个参数为闭包*/ var result = getArr(intArr, pre: {(s:Int)-> Bool in return s>2 }) print(result) //[3, 4, 5, 6]
闭包的简化方式:
1,类型推断简化
因为 Swift 可以推断出闭包的参数和返回值类型,所以不需要完整格式构造内联闭包。
上面的闭包就可以简写为:
{s in return s>2 }2,隐藏return 关键字
如果 闭包内只有一条 return 语句时,可以省略return 关键字,所以上面的闭包还可以在简化为:
{s in s>2}
3,参数名缩写
Swift 为内联函数提供了参数名称缩写功能,通过 $0,$1,$2 顺序使用闭包的参数。
如果使用了参数缩写名称,在函数参数列表中可以省略对闭包的定义,Swift 也会推断闭包参数缩写名称的类型。 in 关键字同样被省略。此时闭包表达式完全由闭包函数体构成。上面的闭包再简化为:
{$0 > 2}
使用闭包的返回值:
闭包表达式的运算结果是函数类型,是有返回值的,所以我们可以直接使用它的返回值
var add = { (str1:String,str2:String) -> String in return str1+str2 }("hello","word") print(add) var add2 = {$0 + $1}("hello","word") print(add2) //helloword //helloword使用 闭包的返回值,需要在闭包表达式的后面加上小括号(),给闭包传递参数。然后将返回值,赋值给变量add.
尾随闭包
闭包作为函数的参数,而且闭包表达式有很长的情况下,调用函数时,代码的可读性就变的很差,为了增强代码的可读性,这里就需要用到 尾随闭包。就是将闭包写在参数列表括号的后面。
需要注意的是,闭包必须是函数参数列表的最后一个参数。
使用尾随闭包调用上面的 getArr 函数
var result1 = getArr(intArr){(s:Int)-> Bool in return s>2} //尾随闭包 var result2 = getArr(intArr){s in return s>2} //闭包类型推断简化 var result3 = getArr(intArr){s in s>2} //尾随闭包影藏return var result4 = getArr(intArr){$0>2} //尾随闭包参数名缩写
相关文章推荐
- iOS-swift-动画 简单基础的动画摘要-1
- Swift -- 函数的使用(函数作为参数、返回值、嵌套函数)
- swift基本用法-for循环遍历,遍历字典,循环生成数组
- 深入探究Swift数组背后的协议、方法、拓展
- Swift之便利构造函数
- Swift Hello World、 注释、分号
- Swift流程控制之循环语句和判断语句详解
- 怎样在swift中使用cocoapods导入的第三方oc库
- Swift学习笔记1
- 为swift编码引入map()和flatMap(), map those arrays
- 窥探Swift之类的继承与类的访问权限
- Swift语法备注
- Swift Moya
- iOS SDK详解之NSPredicate(Swift)
- swift学习笔记之-方法部分
- Swift与Objc(传统语言)的异同
- swift学习记录(函数--嵌套函数)
- Swift 基本运算符(笔记)
- [ios][swift]swift 怎么去除 optional
- swift学习记录(函数--输入输出参数)