课程来自慕课网liuyubobobo老师
闭包
- 闭包的基本语法
// 产生一个随机数组
var arr: [Int] = []
for _ in 0..<100 {
arr.append(Int(arc4random()%1000))
}
// 按从大到小排序
func biggerNumberFirst (a: Int , b: Int) -> Bool {
return a > b
}
arr.sorted(by: biggerNumberFirst)
// 使用闭包 按从小到大排序
arr.sorted(by: {(_ a: Int, _ b: Int) -> Bool in
return a > b
})
- 闭包语法的简化
arr.sorted(by: {(_ a: Int, _ b: Int) -> Bool in
return a > b
})
arr.sorted(by: {(_ a: Int, _ b: Int) -> Bool in return a > b})
arr.sorted(by: {a, b in return a > b})
arr.sorted(by: {a, b in a > b})
arr.sorted(by: {$0 > $1})
arr.sorted(by: >)
- 结尾闭包
arr.sorted(by: {a, b in return a > b})
// 闭包也可以作为一个尾随闭包被书写在 sorted(by:) 方法的括号外面
arr.sorted(){a, b in return a > b}
// 如果闭包表达式是函数唯一的实际参数并且你把闭包表达式用作尾随闭包
// 那么调用这个函数的时候你就不需要在函数的名字后面写一对圆括号
arr.sorted{a, b in return a > b}
- 内容捕获
// 产生一个随机数组
var arr: [Int] = []
for _ in 0..<100 {
arr.append(Int(arc4random()%1000))
}
// 按最接近500排序
arr.sort(){(a, b) -> Bool in abs(a-500) < abs(b-500) }
//闭包能够从上下文捕获已被定义的常量和变量
let num = 700
arr.sort(){(a, b) -> Bool in abs(a-num) < abs(b-num) }
- 闭包和函数是引用类型
func runningMeters(with metersPerDay: Int) -> () -> Int {
var totalMeters = 0
return {
totalMeters += metersPerDay
return totalMeters
}
}
// planA 是一个 ()->Int 的函数
var planA = runningMeters(with: 3000)
// planA() 只执行了闭包,闭包中的参数通过内容捕获获取值
planA() // 3000
planA() // 6000
planA() // 9000
var anotherPlan = planA
anotherPlan() // 12000
planA() // 15000
planA = runningMeters(with: 3000)
planA() //3000
网友评论