文章目录
  1. 1. Swift闭包的特性,摘自swift中文官方解释
  2. 2. 1 Swift闭包的写法:
  3. 3. Swift闭包的用处:
    1. 3.1. 例子—改造UIActionSheet

新年到,新年好,2015年羊年,不知不觉本命年,24岁了亲
已到催婚年龄了,没房没车还是挺可怕的,加把劲啊


在swift中闭包真的是个特别好用的东西,闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似,java8也才刚出了lambdas表达式,测试了一下表示很难用好不好,相比之下,Swift使用就简单很多了。

Swift闭包的特性,摘自swift中文官方解释

闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。Swift会为您管理在捕获过程中涉及到的内存操作。

注意:如果您不熟悉 捕获 (capturing) 这个概念也不用担心,后面会详细对其进行介绍。

在 函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一:

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

Swift的闭包表达式拥有简洁的风格,并鼓励在常见场景中以实现语法优化,主要优化如下:

  • 利用上下文推断参数和返回值类型
  • 单表达式(single-expression)闭包可以省略 return 关键字
  • 参数名称简写
  • Trailing 闭包语法

1 Swift闭包的写法:

从复杂到简单写法:比如一个排序算法sort
1.完整表达式写法:

let nums = [1,2,3]
sort(nums,{(s0:Int,s1:Int) -> Bool in
return s0 > s1
})

2.因为可利用上下文推断参数,所以可以:

sort(nums,{(s0,s1) in
   return s0 > s1
})

3.单行表达式闭包可以省略return,所以可以:

sort(nums,{s0,s1 in s0 > s1})

4.参数名称可以简写用$0,$1依次代表第几个参数,所以:

sort(nums,{$0 > $1})

5.可以通过trailing闭包写法,所以:

sort(nums){$0 > $1}

书写很简单有木有,看起来很舒服有木有,trailing写法我个人不是很喜欢,这样写就比较像写函数了,并且在java上习惯了写接口,所以trailing写法一般我不用。

Swift闭包的用处:

1简化异步处理写法
2取代简单的代理!必须吐槽IOS的代理,虽然说代理的确是好用,但是没必要大家动不动就用代理实现吧?有事没事直接想,哦这个可以通过代理实现,妈哒妈哒妈哒,硬生生要我们写个代理协议,实现代理协议,最后实现方法,这得写多多少代码啊,很累啊有木有。 好吧,如果这只是我一厢情愿,就当这是我一个java狗过来的人不懂你们oc的心。

例子—改造UIActionSheet

比如说比较常用的UIActionSheet
正常要出现一个sheet并且实现点击事件的话,我们需要
1.实现UIACtionSheetDelegate这个协议
2.创建UIActionSheet类A
3.把A的delegate指向self
4.实现UIActtionSheetDelega协议方法,比如点击
5.把sheet最后show出来
这个就是通过代理实现的,比较麻烦。

如果是用闭包的话,咱们可以这样改造UIActionSheet类:

class D3ActionSheet: UIActionSheet,UIActionSheetDelegate{
var block:((Int)->Void)?
func initView(btnTitles:Array<String>,block:((Int)->Void)?) {
self.delegate = self
self.block = block
for btn in btnTitles{
self.addButtonWithTitle(btn)
}
self.addButtonWithTitle("取消")
}
//下标从0开始,对应的就是btnTitles的下标
func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int){
block?(buttonIndex)
}
}

改造完成后,我们要展现一个UIActionSheet并且实现点击事件,我们需要:

1.var sheet = D3ActionSheet()
2.sheet.initView(["1","2"],block:{println($0)})
3.sheet.showInView(self.view)

好了。这只是一个例子。更多闭包的作用可以自己仔细想想。

文章目录
  1. 1. Swift闭包的特性,摘自swift中文官方解释
  2. 2. 1 Swift闭包的写法:
  3. 3. Swift闭包的用处:
    1. 3.1. 例子—改造UIActionSheet