swift closures block weak

swift - cómo hacer que un puntero débil se apague a sí mismo dentro de un bloque



closures block (2)

Me parece que estás tratando de evitar un ciclo de retención con un bloque como lo haces en Objective-C, donde en lugar de hacer referencia a ti mismo, creas una versión débil:

__weak MyType *weakSelf = self; void (^aBlock)() = ^void() { [weakSelf doStuff]; }

No es así como Swift maneja este problema.

En su lugar, tiene el concepto de una lista de captura, que le dice al compilador que hace referencia a las capturas de bloques y qué hacer al respecto. Debe buscar en el libro de referencia de programación de Swift la "Lista de captura" y leer sobre el tema. Para citar el libro:

“Si asigna un cierre a una propiedad de una instancia de clase, y el cierre captura esa instancia al referirse a la instancia o sus miembros, creará un ciclo de referencia fuerte entre el cierre y la instancia. Swift usa listas de captura para romper estos fuertes ciclos de referencia. Para obtener más información, consulte Fuertes ciclos de referencia para cierres ".

Extracto de: Apple Inc. "El lenguaje de programación Swift". IBooks. https://itun.es/us/jEUH0.l

Editado el 4 de enero de 2016:

Para citar la parte del libro Swift que explica cómo crear una lista de captura:

Definición de una lista de captura : cada elemento en una lista de captura es un emparejamiento de la palabra clave débil o sin dueño con una referencia a una instancia de clase (como self) o una variable inicializada con algún valor (como delegate = self.delegate!). Estos emparejamientos se escriben dentro de un par de llaves, separadas por comas.

Coloque la lista de captura antes de la lista de parámetros de cierre y devuelva el tipo si se proporcionan:

lazy var someClosure: (Int, String) -> String = { [unowned self, weak delegate = self.delegate!] (index: Int, stringToProcess: String) -> String in // closure body goes here }

Extracto de: Apple Inc. "El lenguaje de programación Swift (Swift 2)". IBooks. https://itun.es/us/jEUH0.l

Quiero hacer un puntero débil a sí mismo en veloz, como solíamos hacerlo en object-c como

__weak Something *weakself = self;

He encontrado personas que explican cómo usar un ''yo débil'' dentro de un bloque,

{ in [unowned self] ...}

pero no quiero definir ''weakself'' dentro de mi bloque, quiero definir weakself fuera de bloques


Simplemente defina una referencia débil con la palabra clave weak :

weak var weakSelf = self

De la documentation :

Usted indica una referencia débil colocando la palabra clave weak antes de una declaración de propiedad o variable.
...
NOTA: Las referencias débiles deben declararse como variables, para indicar que su valor puede cambiar en tiempo de ejecución. Una referencia débil no puede ser declarada como una constante.