Swift学习笔记系列——(6)闭包
2015-07-13 14:30
393 查看
Tags: Swift 学习笔记
发布时间:2015-07-13
修改时间:2015-07-13
作者:Erwin
博客地址:技术杂货铺
欢迎转载,转载请注明出处。
有名字不捕获
嵌套函数
有名字捕获外层数据
单一返回值,省去return关键字
参数的简写,省去参数定义
traling闭包语法,写在圆括号之外
闭包的一种实现:函数
func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
var reversed = names.sort(backwards)
参数可以用常量和变量的,也可以用inout参数,但是不能有默认值。使用可变参数的条件是给其命名,而且在参数列表最后。
in关键字分割闭包的参数返回类型和闭包体
reversed = names.sort( { s1, s2inreturns1 > s2 } )
使用 0,0, 1, $2……引用闭包的参数
func someFunctionThatTakesAClosure(closure: () -> Void) {
// function body goes here
}
如果一个闭包表达式作为一个函数的唯一参数同时这个闭包表达式又是一个Trailing 闭包,这种情况下调用函数时你不需要在函数名字后写一对圆括号了。
reversed = names.sort() { 0>0 > 1 }
如果只有一个trailing参数,圆括号可以省了
let strings = numbers.map {
(var number) -> String in
var output = “”
while number > 0 {
output = digitNames[number % 10]! + output
number /= 10
}
return output
}
闭包作为类属性而且闭包捕获了实例(无论是引用了实例还是实力的属性),会形成闭包和实力之间的强引用环。破除这种强引用环,需要用到捕获列表。
发布时间:2015-07-13
修改时间:2015-07-13
作者:Erwin
博客地址:技术杂货铺
欢迎转载,转载请注明出处。
Swift学习笔记系列——(6)闭包
闭包
什么是闭包
可以当作参数传递使用的代码块。闭包的三种形态
全局函数有名字不捕获
嵌套函数
有名字捕获外层数据
闭包表达式
没有名字捕获上下文数据简化闭包表达式的途径
根据上下文推测参数和返回值的类型,省去类型单一返回值,省去return关键字
参数的简写,省去参数定义
traling闭包语法,写在圆括号之外
闭包的一种实现:函数
func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
var reversed = names.sort(backwards)
闭包表达式语法
{ (parameters) -> return type instatements }
参数可以用常量和变量的,也可以用inout参数,但是不能有默认值。使用可变参数的条件是给其命名,而且在参数列表最后。
in关键字分割闭包的参数返回类型和闭包体
闭包表达式完整写法
reversed = names.sort({ (s1: String, s2: String) -> Bool in return s1 > s2 })
写在一行的样子
reversed = names.sort( { (s1: String, s2: String) -> Boolinreturns1 > s2 } )省去类型声明后
类型根据上下文推测reversed = names.sort( { s1, s2inreturns1 > s2 } )
单一返回值,省掉return关键字
reversed = names.sort( { s1, s2ins1 > s2 } )简化参数名字后
reversed = names.sort( { 0>0 > 1 } )使用 0,0, 1, $2……引用闭包的参数
用操作符函数后
reversed = names.sort(>)Trailling 闭包
如果你想要传递一个闭包表达式给函数的最后一个参数,同时这个闭包又非常长,这时你可以写一个Trailing 闭包作为替代。一个Trailing 闭包是被写在函数圆括号之外(或之后)的闭包表达式func someFunctionThatTakesAClosure(closure: () -> Void) {
// function body goes here
}
// here's how you call this function without using a trailing closure: someFunctionThatTakesAClosure({ // closure's body goes here }) // here's how you call this function with a trailing closure instead: someFunctionThatTakesAClosure() { // trailing closure's body goes here }
如果一个闭包表达式作为一个函数的唯一参数同时这个闭包表达式又是一个Trailing 闭包,这种情况下调用函数时你不需要在函数名字后写一对圆括号了。
reversed = names.sort() { 0>0 > 1 }
如果只有一个trailing参数,圆括号可以省了
let strings = numbers.map {
(var number) -> String in
var output = “”
while number > 0 {
output = digitNames[number % 10]! + output
number /= 10
}
return output
}
捕获值
捕获的内容有引用也有值副本,不由程序员控制,Swift会做好。闭包作为类属性而且闭包捕获了实例(无论是引用了实例还是实力的属性),会形成闭包和实力之间的强引用环。破除这种强引用环,需要用到捕获列表。
闭包是引用类型的
本章思维导图
相关文章推荐
- swift数组
- swift语言的学习笔记十二(初始化方法)
- swift与OC之间不得不知道的21点
- swift 阅读记录
- Swift enumerate函数与??操作符
- 使用Playground快速练习Swift语法 (一)
- IOS tableview 消除 分割线短 15 像素 ios8方法 swift版
- Swift 学习之路(二)
- Swift 学习之路(一)
- Swift和OC混合编程
- swift基础知识
- 使用Swift读取Cookie内容
- Swift之数组使用
- Swift基础语法介绍
- 从C#到Swift,Swift学习笔记
- Swift中的!和?
- 属性观察_Swift
- Swift结构体和类
- swift 拼图小游戏
- iSwifting社区【www.iSwifting.com】招聘版主