Swift 闭包

Swift 中闭包是引用类型 有些时候定义一个函数可能只需要使用一次, 闭包本质上是函数

闭包写法

一般写法如下:

var arr:[Int] = []

for i in 0 ..< 100{
    arr.append( Int(arc4random()%1000) )
}

arr.sort(by: {(a:Int,b:Int) -> Bool in
    return a > b
})

在闭包的定义中,因为不会被外部调用,所以给闭包取外部的参数名没有意义。

闭包的简化写法:

arr.sort(by: {(a:Int , b:Int)-> Bool in return a > b}) // 如果闭包的函数体只有一行的情况,我们可以将其写在一行里。

arr.sort(by: {a , b in return a > b}) // Swift type inference.

arr.sort(by: {a , b in a > b})

arr.sort(by: { $0 > $1 })

arr.sort(by: >) // ">" 符号本身就是函数.

结尾闭包

Trailing Closure

如果需要传递的闭包在函数参数的末尾,我们可以使用结尾闭包的方式书写,如下:

arr.sort(by: ){ a , b in
    return a > b
}

// 如果将闭包放到()外部,而原函数调用没有任何参数需要传递,那么这里我们可以将小括号去掉。
arr.sort{ a , b in
    return a > b
}

使用结尾闭包的一个例子。

var arr:[Int] = []

for i in 0 ..< 100{
    arr.append( Int(arc4random()%1000) )
}

var r = arr.map(){(number)-> String in
    var number = number
    var res = ""
    repeat {
        res = String(number%2) + res
        number /= 2
    }while number != 0

    return res
}

内容捕获

一下是demo,随机取100个数字,以100为中心,将离100最近的数字越靠前

var arr:[Int] = []

for _ in 0 ..< 100{
    arr.append( Int(arc4random()%1000) )
}
arr
var num = 100

arr.sort{ a , b in
    return abs(a - num ) < abs(b - num)
}

在闭包内能自动捕获外部变量,但是会有内存泄漏的问题。

闭包和函数都有引用类型

// 计算跑步的里程数,单位m
func runningMetersWithMetersPerDay(metersPerDay: Int) -> () -> Int {

    var totalMeters = 0 // 跑步的总数
    return {
        totalMeters += metersPerDay // 两个变量都是通过闭包外部的内容捕获获得值的。
        return totalMeters
    } // 返回闭包
}

var planA = runningMetersWithMetersPerDay(metersPerDay: 5000)
planA() // 5000
planA() // 10000

var planB = runningMetersWithMetersPerDay(metersPerDay: 1000)
planB() // 1000
planB() // 2000


var anotherPlan = planA // 将闭包赋值给另一个变量

anotherPlan() // 15000 在调用的过程中它们的值会累加,说明是引用类型
planA() // 20000 在调用的过程中它们的值会累加,说明是引用类型


let planC = runningMetersWithMetersPerDay(metersPerDay: 2000) // 对于引用类型,不代表里面的值不能被修改
planC() // 2000
planC() // 4000

//planC = runningMetersWithMetersPerDay(metersPerDay: 3000) // 这句赋值会报错
Copyright © http://blog.webfsd.com 2017 all right reserved,powered by Gitbook该文件修订时间: 2018-01-02 01:37:26

results matching ""

    No results matching ""