搜尋

首頁  >  問答  >  主體

ios - swift使用闭包传值

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

2注册成功赋值

3 作为返回值


4 在控制器中调用

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

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

7 再 返回

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

咋回事啊 ?

大家讲道理大家讲道理2894 天前394

全部回覆(2)我來回復

  • 大家讲道理

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

    我看你的這個好像跟閉包 Closure 並沒有關係

    Closure 并没有关系

    以下解答
    此次 Crash 的问题很明显, 你对一个值为 nilOptional 类型进行了强制解包

    图5:'fatal error: unexpectedly found nil while unwrapping an optional value'

    原因

    1. 你的 connectToHost() 应该是异步方法. 该行执行后, 立即就执行了 return registerRes!

    2. 但此时, 你的连接还进行中还未回调 func xmppStreamDidRegister(sender: XMPPStream!) 方法

    3. 你的 registerRes 还是初始化的时候的值 nil以下解答
      此次Crash 的問題很明顯, 你對一個值為nilOptional 類型進行了強制解包

      🎜圖5:'fatal error: unexpectedly found nil while unwrapping an optional value'

      🎜原因

      1. 🎜你的 connectToHost() 應該是非同步方法. 該行執行後, 立即就執行了 return registerRes!

      2. 🎜但此時, 你的連線還進行中還未回呼 func xmppStreamDidRegister(sender: XMPPStream!) 方法

      3. 🎜你的 registerRes 還是初始化的時候的值 nil

        回覆
        0
  • 巴扎黑

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

    你這整個過程都和閉包沒關係……既然你的那個變量肯定會有值,其實可以用嘆號替代問號,這樣在創建時也不用給它賦值nil,獲取時也不用手動解包。好吧我只是說說你代碼上的小問題,至於你要問的問題原因樓上已經說了,你可以造個callback,把這個callback掛到connectHost上。只是這樣會在每一層都開個洞去傳callback……當然也有優雅的解決方案,Github上有個項目叫Async你可以參考,因為我沒細看它的實現也不好在這裝逼

    回覆
    0
  • 取消回覆