Swift 闭包引用类型

2022-03-08  本文已影响0人  爆炸的白菜君
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}

上面的函数返回一个闭包,我们使用一个常量去接受这个返回值

let incrementByTen = makeIncrementer(forIncrement: 10)

这里的 incrementByTen 常量就是 incrementer 这个函数引用

incrementByTen()
//10
incrementByTen()
// 20
incrementByTen()
// 30

这里我们可以看到 runningTotal 这个值,在我们使用返回闭包调用的时候是有累积的。这就说明runningTotal被一个引用类型的值持有着没有被释放。这个引用类型应该就是 incrementByTen

let incrementBySeven = makeIncrementer(forIncrement: 7)
incrementBySeven()
// 7
incrementByTen()
//40

这里我们可以明显的看到,新的常量incrementBySeven和之前的常量incrementByTen有着不同的runningTotal,因为他们是两个独立的引用类型。

这里说的引用类型可以类比于类和数组以及字典这类型的数据。他们的生命周期都是依靠引用计数来维持。

let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()
// 50

incrementByTen()
// 60

这里只是incrementByTen的引用计数变成了2,并没有开辟新的内存空间,所以runningTotal值还是会累计。

上一篇 下一篇

猜你喜欢

热点阅读