Swift 中对闭包的弱引用

Weak reference to closure in Swift

我有以下代码来创建用于数据绑定的可观察对象 属性。它正在进行中,所以我不确定最终的实现是什么,我对 Swift.

还是很陌生
class Observable<T> {
    typealias Observer = T -> Void

    var value: T {
        didSet {
            for observer in self.observers {
                observer?(self.value)
            }
        }
    }

    var observers: [Observer?] = []

    init(_ val: T) {
        self.value = val
    }
}

我想保留对 Observer 闭包的弱引用。我不想依赖客户端来确保闭包在通过捕获列表传入之前是 weak/unowned 。特别是因为在给定的 class 上可以有许多可观察的属性。

是否可以使我的 Observable 中的闭包引用变弱 class?

更新:

我找到了一些我认为可以帮助我完成我想要的资源:

Make self weak in methods in Swift

具体来说,

func methodPointer<T: AnyObject>(obj: T, method: (T) -> () -> Void) -> (() -> Void) {
  return { [unowned obj] in method(obj)() }
}

以下link参考了上面的Whosebug答案并进行了更详细的介绍:

http://blog.xebia.com/2014/10/09/function-references-in-swift-and-retain-cycles/

这是一个双向绑定示例:

http://five.agency/solving-the-binding-problem-with-swift/

具体来说,

class BondBox<T> {
  weak var bond: Bond<T>?
  init(_ b: Bond<T>) { bond = b }
}

监听器被包裹在一个名为 Bond 的 class 中,它在 BondBox 中被弱引用。

Is it possible to make the closure references weak in my Observable class

没有。在 Swift 中只能通过弱引用引用 class 个实例,并且函数不是 class 个实例。 (而且它们不仅必须是 class 个实例,而且它们必须是一个 Optional 包装 class 个实例。)

有一些非常明显的解决方法,或者当然 - 最简单的是包装器 class。但我实际上并不建议在这种情况下这样做,因为你没有说服我首先需要对函数的弱引用。请记住,对没有强引用的对象的弱引用将立即失去引用并指向 nil。我不敢相信这就是你想要的。我认为你在这里吠叫错误的树。

Weak/strong用于对象的内存管理,所以只申请引用类型(即指向对象的类型)的变量。 Swift 中的函数类型不是引用类型,因此谈论它们的变量 weak/strong 没有意义。

另外,您的代码中实际上没有函数类型的变量(除了在迭代的中间)。您只需要一个数组类型的变量。即使在 Objective-C 中,您也只能将变量标记为弱或强,而不是存储在其他事物中的值。

如果你要在 Objective-C 中写你正在写的东西,你 想要“Observable”对关闭。否则,谁else会对闭包有强引用?