我正在重写一些代码,以便将作业附加到闭包数组中,而不是直接执行它们:

var someObject: SomeType?
var jobsArray: [() -> ()] = []

// before rewriting
doExpensiveOperation(someObject!.property)

// 1st attempt at rewriting
jobsArray.append {
    doExpensiveOperation(someObject!.property)
}

但是,由于someobject的值可能在执行闭包之前更改,我现在添加一个闭包列表,如下所示:
// 2nd attempt at rewriting
jobsArray.append { [someObject] in
    doExpensiveOperation(someObject!.property)
}

希望这样,如果在闭包执行之前,某个对象随后被设置为nil,那么闭包仍将访问预期的实例。
但是,处理.property的值可能在执行闭包之前更改的可能性的最简单方法是什么?有比这更好的办法吗?
// 3rd attempt at rewriting
let p = someObject!.property
jobsArray.append {
    doExpensiveOperation(p)
}

我对这个解决方案不是很感兴趣,因为它意味着改变原始代码行。我更喜欢这个,但不管用:
// 4th attempt at rewriting
jobsArray.append { [someObject!.property] in
    doExpensiveOperation(someObject!.property)
}

对斯威夫特来说很陌生,所以所有的指导都很感激。谢谢!

最佳答案

[someObject]这样的捕获列表实际上是[someObject = someObject]的语法糖,其中右侧可以是任意表达式,在形成闭包时绑定到新常量。
因此,一种选择是将示例编写为:

jobsArray.append { [property = someObject!.property] in
  doExpensiveOperation(property)
}

09-10 04:27
查看更多