@Plabo, come detto da @Kirsteins, le animazioni e il completamento non vengono mantenuti da solo, quindi anche se si avvia un'animazione e per qualsiasi motivo il proprio controller di visualizzazione è stato rilasciato, verrà deallocato istantaneamente. Quindi, non è necessario catturare 'sé'. Si consideri l'esempio stupido sotto:
class ViewController: UIViewController {
@IBOutlet weak var button : UIButton!
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad ViewController")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIView.animate(withDuration: 20, animations: {
self.button.frame = CGRect(x: 0, y: 300, width: 30, height: 30)
}) { finished in
self.button.frame = CGRect(x: 0, y: 100, width: 30, height: 30)
}
}
deinit {
print("deinit ViewController")
}
}
Non appena si rilascia, il deinitializer sarà chiamato e non verrà mai eseguito il completamento.
C'è un modo per creare chiusure come 'animazioni' o' completamento' qui? – WildCat
Perché non usano la parola chiave noescape? – Plot
@Plot UIKit è scritto in Objective-C ed è interpolato in Swift. Objective-C non ha la funzione '@ noescape'. – Kirsteins