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.