ios - swift使用闭包传值
大家讲道理
大家讲道理 2017-04-17 17:48:47
0
2
379

1.我有一个swift项目,在XMPP注册模块,我使用闭包传值(代理会了,学学闭包用法),把注册结果传回控制器。
1 初始化

2注册成功赋值

3 作为返回值


4 在控制器中调用

5 结果是不注册他直接不注册,也不连接服务器了。直接返回

6 然后 我找到一个解决办法,一开始给上一种注册结果

7 再 返回

8 最后 结果出来了 注册成功
但是 把我给他初始化赋的结果也打印出来了

咋回事啊 ?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

répondre à tous(2)
大家讲道理

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

  1. Votre connectToHost() doit être une méthode asynchrone. Une fois cette ligne exécutée, return registerRes!

  2. est exécutée immédiatement.
  3. Mais à ce moment, votre connexion est toujours en cours et n'a pas encore été rappelée func xmppStreamDidRegister(sender: XMPPStream!) méthode

  4. Votre registerRes est toujours la valeur lors de l'initialisation nil

巴扎黑

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal