避免捕获闭包中值的副本的最佳方法

2024-02-18

struct Foo {

    var i = 0 { didSet { println("Current i: \(i)") } }

    func delayedPrint() {
        dispatch_async(dispatch_get_main_queue(), { _ in
            println("Closure i: \(self.i)")
        })
    }

    mutating func foo() {
        delayedPrint()
        i++
    }
}

现在的输出为

var a = Foo()
a.foo()

is

Current i: 1
Closure i: 0 // I want current value here.

我想知道避免捕获 ivar 副本的最佳方法是什么。


EDIT 1

是的,转到课堂是我想到的第一件事,也是唯一一件事,但是......这个欺骗了我,让我认为它可以通过结构以某种方式完成......为什么它有效?

mutating func foo() {
    delayedPrint()
    dispatch_async(dispatch_get_main_queue(), { _ in
        println("From foo: \(self.i)")
    })
    delayedPrint()
    i++
}

Output:

Current i: 1
Closure i: 0
From foo: 1
Closure i: 0


我认为你必须在这里使用类而不是结构,因为结构是通过复制传递的,类是通过引用传递的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

避免捕获闭包中值的副本的最佳方法 的相关文章

随机推荐