Maison > Questions et réponses > le corps du texte
1.我有一个swift项目,在XMPP注册模块,我使用闭包传值(代理会了,学学闭包用法),把注册结果传回控制器。
1 初始化
2注册成功赋值
3 作为返回值
4 在控制器中调用
5 结果是不注册他直接不注册,也不连接服务器了。直接返回
6 然后 我找到一个解决办法,一开始给上一种注册结果
7 再 返回
8 最后 结果出来了 注册成功
但是 把我给他初始化赋的结果也打印出来了
咋回事啊 ?
大家讲道理2017-04-17 17:50:47
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 de Optional
Figure 5 : « erreur fatale : nil trouvé de manière inattendue lors du déballage d'une valeur facultative »
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éthode
Votre registerRes
est toujours la valeur lors de l'initialisation nil
巴扎黑2017-04-17 17:50:47
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.