Swift---7.闭包
2017-02-24 本文已影响15人
阿丶伦
- 闭包(与OC中的block相似)
- 内联闭包
- 写法
{(para:type)... -> type in statements}
(由一对花括号包裹,()里带参数名与参数类型,->后接返回值,在"in"关键字后输入函数声明)
{ (a:Int,b:Int) -> Bool in return a>b }
- 闭包会根据上下文推断类型(此处以数组的
sorted(by:)
方法为例,根据方法提示,第一个数组,我们需要传入一个(Int,Int)->Bool
的内联闭包,第二个例子中,我们这边没有写参数类型,也没有写返回值类型,是由于Swift可以自动推断参数类型以及返回值类型,所以我们可以省略箭头,包括括号,以更简短的方式来表明我们想要的做法)
var array = [5,3,2,11,10,8] print(array.sorted(by: {(a:Int,b:Int) ->Bool in return a>b})) var str = ["vc","aa","dd","cc"] print(str.sorted(by:{s1, s2 in return s1>s2}))
- 单行表达式闭包中,如果不写
return
关键字,单行表达式闭包会隐式的返回这行表达式的结果
var str = ["vc","aa","dd","cc"] print(str.sorted(by:{s1, s2 in s1>s2}))
- 参数名称缩写,Swift为内联闭包中的参数提供了简写的参数名称,表现为:1...,我们可以使用它们作为闭包的参数,让我们在编码过程中,不需要输入参数列表,同时,
in
关键字也可不写
var str = ["vc","aa","dd","cc"] print(str.sorted(by:{$0>$1}))
- 符号函数(画个重点,弄懂了回来补上[捂脸])
var str = ["vc","aa","dd","cc"] print(str.sorted(by:>))
- 写法
- 尾随闭包
func testClosures(clour:()->Void) { //尾随闭包可以作为函数的最后一个参数 } testClosures() { //使用尾随闭包进行调用 } testClosures(clour: { //不使用尾随闭包进行调用 })
- 根据此原理,我们可以把上面内联闭包的sorted方法进行改写,我们也可以把"()"省略 ``` var str = ["vc","aa","dd","cc"] print(str.sorted(){$0>$1}) print(str.sorted{$0>$1}) ``` - 当我们需要的闭包方法比较长的时候,我们这一使用尾随闭包,来保证我们代码的可读性 ``` var array = [5,3,2,11,10,8] print(array.sorted(by: {(a:Int,b:Int) ->Bool in if(a>b){return true}else{return false}})) print(array.sorted{ (a:Int,b:Int) ->Bool in if(a>b){ return true }else{ return false } }) ``` - 以函数的map方法,可以更好的说明,```map```方法可以返回一个根据数组进行某种操作的映射.根据```map```方法提供的提示,我们可以看到,在方法后跟随了一个闭包,其中"()"内是每一次遍历数组时得到的值以及类型,一般来说不需要填写类型,只需要给予参数名,让我们方便操作即可,需注意此参数为常数,不可直接改变它的值."T"则是我们想要返回的类型. ``` //numbers.map { (<#Int#>) -> T in //<#code#> //} //返回一个原数组每个值3倍的数组 let numbers = [3, 6, 9] let tribleNumber = numbers.map { (number) -> Int in return number*3 } ```
- 内联闭包
对于闭包,本人理解还有很多不足,希望看文章的人不吝指教,谢谢.