在Swift

时间:2015-06-04 02:15:56

标签: swift closures weak-references

我有以下代码来为数据绑定创建一个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中被弱引用。

2 个答案:

答案 0 :(得分:2)

  

是否可以在我的Observable类

中使闭包引用变弱

没有。只有类实例可以通过Swift中的弱引用引用,而函数不是类实例。 (并且它们不仅必须是类实例,它们必须是包装类实例的可选项。)

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

答案 1 :(得分:0)

弱/强用于对象的内存管理,因此仅适用于引用类型的变量(即指向对象的类型)。 Swift中的函数类型不是引用类型,因此讨论变量的弱/强是没有意义的。

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

如果您要编写用Objective-C编写的内容, 希望“Observable”对闭包有强引用。否则,谁 else 会对闭包有强烈的引用?