¿Cómo establecer una reference débil a un cierre / function en Swift?

En HMSegmentedControl , me gustaría establecer el segmentedControl.indexChangeBlock en un método de instancia para manejar la acción. El ejemplo oficial es: https://github.com/HeshamMegid/HMSegmentedControl/blob/master/HMSegmentedControlExample/HMSegmentedControlExample/ViewController.m (Línea 63 ~ 68), pero eso es Objective-C.

En Swift, las funciones son ciudadanos de primera class. Entonces, quiero establecer un método de instancia para esta propiedad de bloque.
Pero mi código llevaría a una reference circular, parece que debería definir una reference débil:

 class ExampleVC: UIViewController { var segmentedControlIndex: Int = 0 override func viewDidLoad() { let segmentedControl3 = HMSegmentedControl(sectionImages: ... , sectionSelectedImages: ... ) segmentedControl3.frame = ... segmentedControl3.indexChangeBlock = someInstanceMethod } func someInstanceMethod(index: Int) { segmentedControlIndex = index } } 

Sin embargo, no puedo definir una reference débil a un tipo que no sea de class. ¿Que puedo hacer? ¿Es legal hacer esto?

En lugar de definir una reference débil al cierre, debe usar "Lista de captura" en el cierre.

 segmentedControl3.indexChangeBlock = { [unowned self] in self.someInstanceMethod($0) } 

Hasta donde sé, esta es la única manera de evitar ciclos de reference fuertes.

[unowned self] es peligroso. Lo que esto hace es decirle al time de ejecución 'Suponga que no se ha liberado, no se preocupe por la comprobación'. Si se libera mientras tanto, su aplicación será SEGFAULT.

En este caso, { [weak self] in self?.someInstanceMethod($0) } romperá el ciclo de reference, y se convertirá en un no-op si se libera self .

[weak self] siempre es seguro, mientras que [unowned self] puede introducir lockings de aplicación si modifica otras áreas de su código (como jerarquía de vistas, por ejemplo) …