【发布时间】:2015-08-18 11:24:28
【问题描述】:
我有以下代码来创建数据绑定的可观察属性。它正在开发中,所以我不确定最终的实现会是什么,而且我对 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 闭包的弱引用。我不想依赖客户端在通过捕获列表传递它之前确保闭包是弱/无主的。特别是因为给定的类可以有许多可观察的属性。
是否可以在我的 Observable 类中使闭包引用变弱?
更新:
我发现了一些我认为可以帮助我实现我想要的资源:
Make self weak in methods in Swift
具体来说,
func methodPointer<T: AnyObject>(obj: T, method: (T) -> () -> Void) -> (() -> Void) {
return { [unowned obj] in method(obj)() }
}
以下链接引用了上面的 stackoverflow 答案并更详细地介绍了:
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 的类中,该类在 BondBox 中被弱引用。
【问题讨论】:
-
我认为 swift 5.2 的
callAsFunction是可能的
标签: swift closures weak-references