arrays - 没有引用循环的swift中的方法数组

标签 arrays swift function-pointers swift4.2

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

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 方法中使用函数的本地副本。

最佳答案

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

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

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

   // ...
}

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

(MyClass) -> () -> ()

比较Instance Methods are “Curried” Functions in Swift .

关于arrays - 没有引用循环的swift中的方法数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55038194/

相关文章:

swift - 尝试使 ScrollView 松动是快速滚动控制

c - 函数回调和进程间通信是否相同?

function - 使用Lua访问功能主体

javascript - 如何在 JavaScript 中创建一个索引从 1 开始的数组?

java - 数组的选择排序方法

xcode - ParseUI PFLogInViewController - 指定字段

c - 如何声明函数指针参数

jersey - 返回 JSONArray 而不是 JSONObject, Jersey JAX-RS

javascript - 如何将日期组件数组转换为 JavaScript 日期对象?

ios - 在我们的 Swift 文件中,我在哪里导入 swift 模块?