首页 > 解决方案 > 没有参考周期的快速方法数组

问题描述

我的目标是创建一个包含数组的类。数组的元素将是同一类的方法。喜欢:

class MyClass {
    lazy var functions = [self.myFirstMethod, self.mySecondMethod]

    deinit {
        print("Deinit")
    }

    func myFirstMethod() {
        // Do Something
    }

    func mySecondMethod() {
        // Do Something
    }

    func executeAll() {
        for f in functions {
            f()
        }
    }
}

当我调用它时executeAll()它工作正常并且我达到了我的预期结果:

var myObject = MyClass()
myObject.executeAll()

问题是,它创建了参考循环。的实例MyClass持有数组functionsfunctions数组持有self。所以如果我写下面的代码:

var myObject: MyClass? = MyClass()
myObject.executeAll()
myObject = nil

deinit由于这个强引用循环,它不会调用方法。如何将方法指针添加到数组中weak self?我不想在executeAll方法中使用函数的本地副本。

标签: arraysswiftfunction-pointersswift4.2

解决方案


如果方法列表独立于特定实例,则可以将其设为类型属性并避免引用循环:

class MyClass {
    static let functions = [myFirstMethod, mySecondMethod]

    func executeAll() {
        for f in MyClass.functions {
            f(self)()
        }
    }

   // ...
}

数组元素是类型的“柯里化函数”

(MyClass) -> () -> ()

compare实例方法是 Swift 中的“柯里化”函数


推荐阅读