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

问题描述 投票:2回答: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方法中使用函数的本地副本。

arrays swift function-pointers swift4.2
2个回答
2
投票

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

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

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

   // ...
}

数组元素是该类型的“curried函数”

(MyClass) -> () -> ()

比较Instance Methods are “Curried” Functions in Swift


-1
投票

试试这个,

class Unowned<T: AnyObject> {
    unowned let value: T
    init(_ value: T) {
        self.value = value
    }
}

var myObject: MyClass = MyClass()
var myUnowned = Unowned(myObject)
myUnowned.value.executeAll()
© www.soinside.com 2019 - 2024. All rights reserved.