2017-08-28 96 views
2

我有一個函數返回一個類對象或零。該功能的目的是檢查是否存在Chat。聊天ID存儲在MySQL中。如果ID存在,我執行Firebase引用來獲取快照,然後獲取對象。如果ID不存在,我返回nil:void函數中意外的非void返回值Swift3

func findChat(string: String) -> Chat? { 

    var returnValue: (Chat?) 
    let url = getChatsURL 
    let Parameters = [ "title" : string ] 

    Alamofire.request("\(url)", method: .post, parameters: Parameters).validate().responseString { response in 
      if let anyResponse = response.result.value { 
       self.responseFromServer = anyResponse 
      } 

      if self.responseFromServer == "" { 
       returnValue = nil 
      } else { 
       let ref = DatabaseReference.chats.reference() 
       let query = ref.queryOrdered(byChild: "uid").queryEqual(toValue: (self.responseFromServer)) 
       query.observe(.childAdded, with: { snapshot in 
       returnValue = Chat(dictionary: snapshot.value as! [String : Any]) 
      }) 
     } 
     return returnValue 
    } 

} 

然而,在return returnValue我越來越空隙功能

意外的非空返回值。

想到我可能會錯過的任何想法?

+0

類似[這個問題](https://stackoverflow.com/a/32121273/6541007)。 – OOPer

回答

2

問題是你試圖從一個閉包中返回一個非void值,它只能從閉包中返回,但由於該閉包需要一個void返回值,所以會收到錯誤。

您不能從使用標準return ...語法異步函數返回,你必須聲明你的函數接受完成處理程序和完成處理內部的異步網絡調用返回的值。

func findChat(string: String, completion: @escaping (Chat?)->()) { 
    var returnValue: (Chat?) 
    let url = getChatsURL 
    let Parameters = [ "title" : string ] 

    Alamofire.request("\(url)", method: .post, parameters: Parameters).validate().responseString { response in 
     if let anyResponse = response.result.value { 
      self.responseFromServer = anyResponse 
     } 
     if self.responseFromServer == "" { 
      completion(nil) 
     } else { 
      let ref = DatabaseReference.chats.reference() 
      let query = ref.queryOrdered(byChild: "uid").queryEqual(toValue: (self.responseFromServer)) 
       query.observe(.childAdded, with: { snapshot in 
       completion(Chat(dictionary: snapshot.value as! [String : Any])) 
      }) 
     } 
    } 
} 

然後你就可以調用這個函數,並使用返回值是這樣的:

findChat(string: "inputString", completion: { chat in 
    if let chat = chat { 
     //use the return value 
    } else { 
     //handle nil response 
    } 
}) 
+1

哇!非常感謝你。該解決方案完美運作。我將需要學習更多的東西來理解爲什麼! – Sente

+0

很高興我能幫到你。如果您想了解更多關於該主題的內容,請查看異步函數和完成處理程序(如果您非常熱衷,即使通常關閉,完成處理程序實際上也是關閉)。 –

2

你的塊是異步執行的,但你試圖從封閉函數中返回一個值。它不這樣工作。你的findChat函數需要自己完成一個完成塊,而不是返回一個值,然後你可以從你試圖說return returnValue的地方調用完成塊。