Mutación de uno mismo (struct / enum) dentro del cierre de escape en Swift 3.0

En swift 2.2, podríamos mutar una estructura o enumeración dentro de un cierre, cuando estaba dentro de una function de mutación. Pero en swift 3.0 ya no es posible. Obtuve el siguiente error

el cierre no puede capturar implícitamente un parámetro de auto mutación

Aquí hay un fragment de código,

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) } } 

Me parece que los types de valor no deben ser mutables. Tengo casos, donde tengo que modificar una variable en la estructura dentro de una de las funciones, cuando recibo la respuesta API. (En el cierre de finalización)

¿Es lo que estaba haciendo en veloz 2.2, imposible o hay manera de lograr esto?

El problema es que los cierres de @escaping pueden almacenarse para su posterior ejecución :

Escapar cierres

Se dice que un cierre se libera de una function cuando el cierre se pasa como un argumento a la function, pero se invoca después de que la function regrese. …

Una forma en que un cierre puede escaping es almacenarse en una variable que se define fuera de la function …

Dado que el cierre se puede almacenar y vivir fuera del scope de la function, la estructura / enum dentro del cierre (auto) se copyrá (es un valor) como un parámetro del cierre. Y, si se permite mutar, el cierre podría tener una copy antigua de la misma, lo que provocaría resultados no deseados.

Entonces, en respuesta a tu pregunta, no puedes; a less que pueda eliminar "@escaping" (no es su caso porque es una API de terceros)

Sí, puedes hacer algo como esto.

 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) } } 

Struct es el tipo de valor. Entonces, cuando se usa como Model o ModelView, puede completar un cierre con un nuevo Value to VC.

 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) } }