9 闭包——《Swift3.0从入门到出家》

8  闭包数组

 

Swift语言中能够使用一块独立代码块替代函数的定义,称独立的代码块为闭包闭包

闭包格式为:app

{(参数列表)->返回值类型    indom

执行语句函数

}spa

例子:排序

<1>使用闭包实现两个数的和字符串

var sum:(Int,Int) ->Int = {(a:Int, b:Int)->Int in return a + b}编译器

<2>使用闭包实现一个整数和一个字符串的拼接,将拼接的结果返回io

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))

 

自动闭包就是 编译器自动将表达式转化成闭包

相关文章
相关标签/搜索