带闭包的Swift,Observer模式

带闭包的Swift,Observer模式,swift,design-patterns,observer-pattern,Swift,Design Patterns,Observer Pattern,我试图在swift中仅使用函数实现观察者模式: var closures: [() -> Void] = [] class A: NSObject { static var c = 0 var i = 0 override init() { super.init() self.i = A.c A.c += 1 } func foo() { print("Hi: \(

我试图在swift中仅使用函数实现观察者模式:

var closures: [() -> Void] = []

class A: NSObject
{
    static var c = 0
    var i = 0

    override init()
    {
        super.init()
        self.i = A.c
        A.c += 1
    }

    func foo()
    {
        print("Hi: \(i)")
        print("\(A.c)")
    }
} // class

var aa:A? = A()

closures.append(aa!.foo)

for item in closures
{
    item()
}

aa = A()

for item in closures
{
    item()
}
这张照片是:

Hi: 0
1
Hi: 0
2
第一个问题,看起来实例变量
i
从未被修改过,你知道为什么吗

第二个问题,它会泄漏内存吗?既然我有一个函数数组,那么
aa
是否会在不清空数组的情况下被释放


第三个问题,对于只使用函数的观察模式,有更好的想法吗?(我不想使用协议)

您误解了保留/释放周期。让我们逐行浏览您的代码:

var aa:A? = A()
初始化
a
的新实例。此内存的保留计数为1

closures.append(aa!.foo)
A
的实例附加到
closures
数组中。保留计数为2

for item in closures
{
    item()
}
A
的第一个实例调用
foo

aa = A()
创建
A
的另一个实例。第一个实例继续被数组保留,保留计数下降到1。但是
A.c
是递增的,因为您在
init
方法中对其进行了编码

for item in closures
{
    item()
}
您仍在对第一个对象调用该方法
A.c
与第二个对象共享,但
i
不共享。第二个对象从不在
闭包
数组中


在我回答其他问题之前:你为什么要这么做?

我在谷歌上找到了使用更好关键词的解决方案。 我需要使用闭包实现观察者模式,以避免原型,从而将观察者与观察者解耦。 观察者是一个具有闭包数组的对象,如下所示:
var数组:[()->()]=[]

每个可观察对象将其函数添加到此数组中,当需要时,观察者将调用此数组的每个或任何函数。 功能如下所示

lazy var someClosure:()->String={
[无主的自我,]在
//封闭体在这里
}
为避免保留循环,必须将
自身
捕获为
未发现


下面这篇文章详细介绍了这个解决方案:

我猜“为什么”是“什么”。我试图实现一个观察者模式,而不使用类型。我有一个带有函数数组的类,像类a这样的对象会将它们的函数添加到数组中。需要时,将调用数组的每个函数。我可以用协议做同样的事情,但我想尝试一些不同的东西。