在Swift中为闭包捕获对象的属性

在Swift中为闭包捕获对象的属性,swift,Swift,我正在重写一些代码,以便将作业附加到闭包数组中,而不是直接执行它们: var someObject: SomeType? var jobsArray: [() -> ()] = [] // before rewriting doExpensiveOperation(someObject!.property) // 1st attempt at rewriting jobsArray.append { doExpensiveOperation(someObject!.proper

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

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)
}
如果在闭包执行之前someObject随后被设置为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)
}

@那不是一个数组,这是一个捕获列表。请参阅中的“定义捕获列表”