L'ensemble de votre processus n'a rien à voir avec les fermetures... Puisque votre variable aura certainement une valeur, vous pouvez en fait utiliser un point d'exclamation au lieu d'un point d'interrogation, vous n'avez donc pas besoin de lui attribuer zéro lors de la création. et vous n'avez pas besoin de le déballer manuellement lorsque vous le recevez. Eh bien, je parle juste d'un petit problème dans votre code. Quant à la raison de la question que vous souhaitez poser, elle a été mentionnée ci-dessus. Vous pouvez créer un rappel et suspendre ce rappel sur connectHost. C'est juste que cela ouvrira un trou dans chaque couche pour passer le rappel... Bien sûr, il existe des solutions élégantes. Il existe un projet sur Github appelé Async auquel vous pouvez vous référer, car je n'ai pas regardé attentivement son implémentation. et c'est difficile de se montrer ici.
Je pense que cela n'a rien à voir avec la fermeture
Closure
La réponse suivante
Le problème avec ce crash est évident, Vous avez forcé le déballage d'un type
nil
avec une valeur deOptional
Raison
Votre
connectToHost()
doit être une méthode asynchrone. Une fois cette ligne exécutée,return registerRes!
Mais à ce moment, votre connexion est toujours en cours et n'a pas encore été rappelée
func xmppStreamDidRegister(sender: XMPPStream!)
méthodeVotre
registerRes
est toujours la valeur lors de l'initialisationnil
L'ensemble de votre processus n'a rien à voir avec les fermetures... Puisque votre variable aura certainement une valeur, vous pouvez en fait utiliser un point d'exclamation au lieu d'un point d'interrogation, vous n'avez donc pas besoin de lui attribuer zéro lors de la création. et vous n'avez pas besoin de le déballer manuellement lorsque vous le recevez. Eh bien, je parle juste d'un petit problème dans votre code. Quant à la raison de la question que vous souhaitez poser, elle a été mentionnée ci-dessus. Vous pouvez créer un rappel et suspendre ce rappel sur connectHost. C'est juste que cela ouvrira un trou dans chaque couche pour passer le rappel... Bien sûr, il existe des solutions élégantes. Il existe un projet sur Github appelé Async auquel vous pouvez vous référer, car je n'ai pas regardé attentivement son implémentation. et c'est difficile de se montrer ici.