Swift:弱引用函数作为闭包?

Swift:弱引用函数作为闭包?,swift,memory-leaks,closures,strong-reference-cycle,Swift,Memory Leaks,Closures,Strong Reference Cycle,在Swift中,我目前面临的问题是,我需要经常在闭包中包装函数,以防止在将类的函数作为闭包参数传递时出现强引用循环。例如,在以下场景中: class A { var foo: () -> Void } class B { private let a: A init() { self.a = A() a.foo = { [weak self] in self?.foo() } // <- Can this be simpli

在Swift中,我目前面临的问题是,我需要经常在
闭包中包装
函数
,以防止在将类的函数作为闭包参数传递时出现强引用循环。例如,在以下场景中:

class A {
    var foo: () -> Void
}

class B {

    private let a: A

    init() {
        self.a = A()
        a.foo = { [weak self] in self?.foo() } // <- Can this be simplified, while still avoiding strong reference cycles?
    }

    private func foo() {}

}
其中,
a.foo=weak foo
相当于self?.foo()中的
a.foo={[weak self]

或者,在处理不属于
self
的函数时:

let b = B()
let a = A()
a.foo = weak b.foo

其中
a.foo=weak b.foo
相当于
a.foo={[weak b]in b?.foo()}


注意:我不打算让闭包本身具有弱可引用性。我只是建议将
弱b.foo
编译为与
{[weak b]in b?.foo()}

相同的方式,如果您想使用类b的实例方法来设置A的foo属性,据我所知,这是唯一不会导致内存泄漏的方法。尽管有一个讨论正在进行中,以使闭包属性弱@AnirudhBandi,但该主题中提出的内容略有不同。在那次讨论中,他们建议将闭包作为引用类型,我不建议这样做。我的建议是,引入一些语法sugar,以便将
a.foo=weak b.foo
编译为与
a.foo={[weak b]in b?.foo()}
等价。区别在于,在您所指的讨论中,他们建议将闭包作为一个整体存储。我仍然建议阻止闭包,但对程序员隐瞒。我在Swift论坛上发现了这个讨论,但没有解决您的问题。
let b = B()
let a = A()
a.foo = weak b.foo