在Swift 3.0中转义自我封闭(struct / enum)
在swift 2.2中,当它在一个变异函数中时,我们可以在一个闭包中改变结构或枚举。 但在3.0迅速不再可能。 我得到以下错误
闭包不能隐式捕获一个变异的自参数
这是一个代码片段,
struct Point { var x = 0.0, y = 0.0 mutating func moveBy(x deltaX: Double, y deltaY: Double) { x += deltaX y += deltaY test { (a) -> Void in // Get the Error in the below line. self.x = Double(a) } } mutating func test(myClosure: @escaping (_ a: Double) -> Void) { myClosure(3) } }
我得到的价值types不应该是可变的。 我有案例,当我收到API响应时,我必须修改其中一个函数的结构中的一个variables。 (在完成closures时)
我是在做什么2.2,不可能或有办法做到这一点?
问题是, @ escaping闭包可以被存储以供稍后执行 :
逃脱closures
当闭包被作为parameter passing给函数时,闭包被认为是转义函数,但在函数返回后被调用。 …
闭包可以逃脱的一种方式是通过存储在函数外定义的variables中。
由于闭包可以被存储和超出函数的范围,闭包(self)中的struct / enum将作为闭包的参数被复制(它是一个值)。 而且,如果允许变更,封闭可能会有一个旧的副本,导致不必要的结果。
所以,在回答你的问题时,你不能; 除非你能够删除“@escaping”(不是你的情况,因为它是第三方API)
是的,你可以做这样的事情。
struct Point { var x = 0.0, y = 0.0 mutating func moveBy(x deltaX: Double, y deltaY: Double) { x += deltaX y += deltaY test { (a) -> Void in self.x = Double(a) } } mutating func test(myClosure: (_ a: Double) -> Void) { myClosure(3) } }
结构是值types。 所以当作为Model或ModelView使用时,可以用VC将新的Value组合成一个闭包。
struct Point { var x = 0.0, y = 0.0 mutating func moveBy(x deltaX: Double, y deltaY: Double) { x += deltaX y += deltaY test { [x, y](a) -> Point in // Get the Error in the below line. return Point(x: Double(a), y: y) } } mutating func test(myClosure: @escaping (_ a: Double) -> Point) { self = myClosure(3) } }