var a = ["2", "3", "1", "0", "4", "6"]
// 1. 普通写法
var b = a.sorted(by: { (x: String, y: String) -> Bool in
return x > y
})
//2. 闭包尾随写法
var b1 = a.sorted{ (x: String, y: String) -> Bool in
return x > y
}
//3. 省略参数类型,返回类型写法
var b2 = a.sorted{ (x, y) in
return x > y
}
//4. 省略参数写法
var b3 = a.sorted{
return $0 > $1
}
//5. 单个表达式省略return写法
var b4 = a.sorted{$0 > $1}
//6. >号写法
var b5 = a.sorted(by: >)
print("b = \(b)")
//数组每个元素映射
let digitNames = [
0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]
let numStr = numbers.map { (number) -> String in
var num = number
var total = ""
repeat {
let temp = num%10
total = digitNames[temp]! + total
num /= 10
}while num > 0
return total
}
print(numStr)
值的捕获
嵌套函数也是一种闭包,闭包可以捕获值
func addOneFunc(value:Int) -> () -> Int{
var total = 0
func addOne() -> Int{
total += value
return total
}
return addOne
}
var a = addOneFunc(value: 10)
print(a())
print(a())
print(a())
print(a())
print(a())
var b = addOneFunc(value: 5)
print(b())
print(b())
print(b())
print(b())
print(b())
逃逸闭包
逃逸闭包是指函数返回后才会执行的闭包
多线程中,函数已经返回,子线程才开始执行闭包,那这个闭包就需要逃逸
逃逸闭包入参要写标注@escaping
逃逸闭包在调用时候要显示的写self
var arr = [() -> Void]()
func escapingClosureFunc(closure: @escaping () -> Void){
arr.append(closure)
}
func noescapingClosureFunc(closure: () -> Void){
closure()
}
class SomeClass {
var x = 10
func doSomething() {
escapingClosureFunc {
self.x = 100
}
noescapingClosureFunc {
x = 200
}
}
}
var instance = SomeClass()
instance.doSomething()
print(instance.x)
arr.first?()
print(instance.x)