arrays - 没有参考周期的快速方法数组
问题描述
我的目标是创建一个包含数组的类。数组的元素将是同一类的方法。喜欢:
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
持有数组functions
和functions
数组持有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)()
}
}
// ...
}
数组元素是类型的“柯里化函数”
(MyClass) -> () -> ()
compare实例方法是 Swift 中的“柯里化”函数。
推荐阅读
- assembly - 在向量的浮点和定点元素之间进行转换时,ARM 上 VCVT 指令的 x86 等效项是什么?
- ios - 有没有办法在 iOS 上的旧通知之上显示持久的本地通知?
- java - 如何从 Java 中的字符串路径加载 JSON 并打印 json 值?
- regex - 如何在ansible中使用变量进行正则表达式搜索
- flutter - 我该如何解决它“必须向文本小部件提供非空字符串”
- python - 如何删除方括号并将该数据存储在python中的dict中
- jasper-reports - jasper 报告中所有元素的位置向下移动了 0.06 英寸
- node.js - 如何保存加密文件并使用nodejs读取文件
- windows-authentication - 适用于 Intranet 用户的 ADFS WIA
- mongodb - MongoDB/Mongoose 中的可扩展性:使用 Model.find() 搜索一个集合还是使用双向引用搜索第二个集合更好?