首页 > 代码库 > SWIFt闭包

SWIFt闭包

闭包的三种形式


1.全局函数是一个有名字但不会捕获任何值的闭包
2.嵌套函数是一个有名字并且可以捕获其封闭函数域内值的闭包
3.闭包表达式时一个利用轻量级语法缩写的可以捕获其上下文中变量或者常量值的没有名字的闭包

SWIFT闭包中的一些特点


1.利用上下文推断参数和返回值类型
2.单表达式闭包可以省略return关键字
3.参数名称简写
4.Trailing闭包语法

闭包表达式


一般情况下我们采用如下方式使用sort

 

1// Playground - noun: a place where people can play
2 
3import Cocoa
4 
5func backwards(str1:String,str2:String)->Bool{
6    return str1>str2
7}
8let names=["LiSen","Dinal","Apple","Swift"]
9let reverse=sort(names, backwards)

但是我们会发现这个写法是如此的繁琐,那么我们可以采用如下的闭包写法

1import Cocoa
2let names=["LiSen","Dinal","Apple","Swift"]
3let reverse=sort(names,{(s1:String,s2:String)->Bool in s1>s2})
4reverse

如果闭包只有一条语句,那么我们可以省略掉return语句。
由于闭包能够自动推断参数类型,并且可以采用参数简写的方式,我们可以进一步缩减上面的语句。

1// Playground - noun: a place where people can play
2 
3import Cocoa
4let names=["LiSen","Dinal","Apple","Swift"]
5let reverse=sort(names,{ $0 > $1}) //$0代表第一个参数,$1代表第二个参数,参数名称必须由0开始
6reverse

 

运算符函数


对于上面的闭包,更简单的写法如下

 

1import Cocoa
2let names=["LiSen","Dinal","Apple","Swift"]
3let reverse=sort(names, >)
4reverse
Trailing闭包
1import Cocoa
2let digitNumber=[
3    0:"Zero",1:"One",2:"Two",3:"Three",4:"Four",5:"Five",6:"Six",7:"Seven",8:"Eight",9:"Nine"
4]
5let numbers = [1990,629]
6numbers.map(
7    (var number)  -> String in{ //var定义变量参数用于在下面修改
8    var output = "";
9    while(number>0){
10    output=digiNumber[number%10]!+output //!防止查找失败返回错误
11    number/=10;
12    }
13    return output
14    }
15     
16)
捕获
1// Playground - noun: a place where people can play
2 
3import Cocoa
4func MakeIncrement(forIncrement amount:Int)-> ()->Int{ //MakeIncrement外部名称是forIncrement,返回一个无参的返回值是Int类型的函数
5    var totalAmount = 5
6    func Increment() -> Int{
7        totalAmount += amount
8        return totalAmount
9    }
10    return Increment
11}
12let increment = MakeIncrement(forIncrement: 10)
13increment() //15

swift会决定捕获时饮用还是拷贝值,同时swift也会处理变量的内存引用。
如果闭包分配给一个类实例的属性,并且改闭包通过指向该实例或其成员来捕获了该实例,你将创建一个在闭包和实例间的强引用环。
闭包是引用类型
 
 
http://www.iamlisen.com/swift-closure.html