我有以下代码来为数据绑定创建一个observable属性。它正在进行中,所以我不确定最终的实现是什么,而且我对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中被弱引用。
答案 0 :(得分:2)
是否可以在我的Observable类
中使闭包引用变弱
没有。只有类实例可以通过Swift中的弱引用引用,而函数不是类实例。 (并且它们不仅必须是类实例,它们必须是包装类实例的可选项。)
有一些非常明显的方法,或者当然 - 最简单的是包装类。但我实际上并没有建议在这种情况下,因为你没有说服我这里首先需要对函数的弱引用。请记住,对没有强引用的对象的弱引用将立即丢失引用并将指向nil。我无法相信这就是你想要的。我想你在这里吵了一棵错误的树。
答案 1 :(得分:0)
弱/强用于对象的内存管理,因此仅适用于引用类型的变量(即指向对象的类型)。 Swift中的函数类型不是引用类型,因此讨论变量的弱/强是没有意义的。
另外,在代码中实际上并没有函数类型的变量(迭代中间除外)。你只需要一个数组类型的变量。即使在Objective-C中,您也只能将变量标记为弱或强,而不是存储在其他内容中的值。
如果您要编写用Objective-C编写的内容, 希望“Observable
”对闭包有强引用。否则,谁 else 会对闭包有强烈的引用?