弱引用的封盖,斯威夫特(Weak reference to closure in Swift)

2019-10-23 06:36发布

我有以下代码来创建数据绑定的观察特性。 这是在作品中,所以我不知道什么是最终的实施将是,我仍然很新的雨燕。

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
    }
}

我想保持弱引用的观测关闭。 我不想依靠客户端,以确保封闭弱/中传递,通过捕获列表之前无主的。 特别是,因为可以有一个给定的类许多观察到的性能。

是否有可能使我的可观察类弱关闭引用?

更新:

我发现一对夫妇,我认为会帮助我达到我想要的资源:

进行自我在斯威夫特方法弱

特别,

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

下面的链接是指上述计算器的答案,并进入一些细节:

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 }
}

其中听者被包裹在一个叫做债券类,这是在BondBox弱引用。

Answer 1:

是否有可能使关闭引用弱在我的可观察类

不,只有类的实例可以通过在斯威夫特弱引用被称为和功能是不是一个类的实例。 (不仅是他们必须是类的实例,它们必须是可选的包装类的实例。)

有一些解决这个相当明显的方式,或课程 - 其中最简单的一个包装类。 但其实我不建议在这种情况下,因为你还没有说服我,在这里需要摆在首位,以功能弱引用。 请记住,一个弱引用的对象,该对象没有强引用将立即失去了参考,并无偿地指指点点。 我不能相信这是你想要的。 我觉得你在这里乱叫了一个错误的树。



Answer 2:

弱/强是用于对象的内存管理,所以只能申请参考类型的变量(即类型的指向对象)。 在斯威夫特功能类型不是引用类型,因此它没有意义谈论弱/强他们的变量。

另外,你实际上并没有在你的代码函数类型的变量(除在迭代的中间)。 您只需数组类型的变量。 即使在Objective-C,你只能标记变量作为弱或强,重视其都存储在其他的事情。

如果你写你在Objective-C编写的东西,你希望“ Observable ”不得不封盖强引用。 否则, 还有谁就会有很强的参考关闭?



文章来源: Weak reference to closure in Swift