Swift:闭包专题

1. 基本用法

import Foundation

var arr = [3, 1, 4, 5, 2]
arr.sort(by: { // 一定要加by
    (a: Int, b: Int) -> Bool in
    return a > b
})
arr.sort(by:{
    a, b in
    return a > b
})
arr.sort(by:{
    a, b in
    a > b
})
arr.sort(by:{
    a, b in
    a > b
})
arr.sort(by:{$0 > $1})
arr.sort(by: >)
arr

2. 结尾闭包

import Foundation

var arr = [3, 1, 4, 5, 2]

// 当sort传入的参数的最后一个时闭包的时候,就可以把闭包拿出来
arr.sort(){
    a, b in return a > b
}
// 当只有结尾闭包一个参数的时候小括号可以省略
arr.sort{
    a, b in return a > b
}

arr
// 转成二进制
arr.map() { // map函数不改变arr,因此执行结束之后还是原来的,这里的()可以省略
    (num: Int) -> String in
    var res = ""
    var num = num
    repeat {
        res = String(num % 2) + res
        num /= 2
    } while num != 0
    return res
}

3. 内容捕获,闭包内的变量可以来自外界

import Foundation

var arr = [3, 1, 4, 5, 2]

var num = 0
arr.sort{ // 谁离num更近?由于num可能是个变量,因此需要进行内容捕获
    abs($0 - num) < abs($1 - num)
}

4. 闭包和函数都是引用类型

import Foundation

func run(_ step: Int) -> () -> Int {
    var total = 0
    return { // 返回的是一个闭包
        total += step
        return total
    }
}

var planA = run(1000)
planA() // 1000
planA() // 2000
planA() // 3000

var planB = run(2000)
planB() // 2000
planB() // 4000
planB() // 6000

let planC = planB
planC() // 8000
planB() // 10000

 

猜你喜欢

转载自blog.csdn.net/shijie97/article/details/83992918