検索

ホームページ  >  に質問  >  本文

ios - swift使用闭包传值

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

2注册成功赋值

3 作为返回值


4 在控制器中调用

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

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

7 再 返回

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

咋回事啊 ?

大家讲道理大家讲道理2894日前395

全員に返信(2)返信します

  • 大家讲道理

    大家讲道理2017-04-17 17:50:47

    あなたのこれは閉鎖とは何の関係もないと思います Closure

    次の回答
    このクラッシュの問題は明らかです。値が nilOptional

    型を強制的に解凍しました。

    図 5: 「致命的なエラー: オプションの値のラップ解除中に予期せず nil が見つかりました」

    理由

    1. connectToHost() は非同期メソッドである必要があります。この行が実行されると、すぐに return registerRes!

    2. が実行されます。
    3. しかし、現時点では、接続はまだ進行中であり、まだコールバックされていません func xmppStreamDidRegister(sender: XMPPStream!) メソッド

    4. registerRes は初期化中の値のままです nil

      返事
      0
  • 巴扎黑

    巴扎黑2017-04-17 17:50:47

    あなたのプロセス全体はクロージャとは何の関係もありません...変数には必ず値があるため、実際には疑問符の代わりに感嘆符を使用できます。そのため、作成時にそれに nil を割り当てる必要はありません。入手時に手動で開梱する必要はありません。そうですね、私はあなたのコードの小さな問題について話しているだけです。あなたが尋ねたい質問の理由については、コールバックを作成し、このコールバックをconnectHostにハングさせることができます。これは、コールバックを渡すために各レイヤーに穴を開けることになるだけです...もちろん、Github には Async というプロジェクトがありますので、それを参照してください。私はその実装を注意深く見ていませんでした。ここで自慢するのは難しいです。

    返事
    0
  • キャンセル返事