2015-04-02 23 views
0

我有一個使用Xcode 6.2和Swift的問題,我有一個從函數返回的元組。我有一個子函數運行在正在將用戶身份驗證到我們的數據存儲中的函數中,然後返回認證令牌。如果用戶沒有進行身份驗證,即有錯誤,那麼我將正確地返回給調用函數。如果用戶通過身份驗證,那麼即使我正在進行相同的變量賦值,我也只會將nil傳回給調用控制器。這裏是我們正在使用的代碼:在else子句中分配的變量沒有通過Swift返回

func login(email:String, password:String) -> (uid: String?, provider: String?, error: NSError?) { 
    var errorStatement: NSError? 
    var provider: String? 
    var testResult: String? 
    var authData: FAuthData 
    ref.authUser(email, password: password) { 
     error, authData in 
     if error != nil { 
      // an error occured while attempting login 
      println("error is: \(error)") 
      errorStatement = error 
      testResult = "failed" 
      provider = "Error" 
     } else { 
      // user is logged in, check authData for data 
      testResult = "passed" 
      provider = authData.provider 
      userUID = authData.uid 
      println("User uid = \(userUID) and provider = \(provider)") 
      } 

    } 

    return (testResult, provider, errorStatement) 


} 

我得到完美的東西,當它有一個錯誤,但沒有什麼時,當它很好。我知道這將是一個簡單的修復,但我似乎無法找到它。感謝任何幫助,因爲我是這種語言的新手。

+3

異步代碼的建議不同步運行。 – nhgrif 2015-04-02 22:45:44

+0

好的,這是有道理的,我怎麼能得到這個正確傳遞呢?我試圖把返回的if-else塊,但得到錯誤,因爲沒有在該函數調用返回,我不能找出一種方法來添加返回 – 2015-04-02 23:12:19

+0

如果它不是一個函數返回,如果它異步運行。您可能需要在else子句的末尾調用委託方法,或者在您的函數中使用在else子句末尾調用的完成處理程序。 – rdelmar 2015-04-02 23:19:25

回答

0

下面是更正後的代碼,我實現完成後@rdelmar

func login(email:String?, password:String?, completion: (result: String?, errorDesc: String?) -> Void) { 
    var errorStatement: String? 
    var testResult: String? 
    ref.authUser(email, password: password) { 
     error, authData in 
     if error != nil { 
      // an error occured while attempting login 
      println("error is: \(error)") 
      println(error.domain) 
      errorStatement = "errpor"//error.localizedDescription 
      testResult = "failed" 
      completion(result: testResult, errorDesc: errorStatement) //send the calling function the attached information 
      } else { 
      // user is l ogged in, check authData for data 
      testResult = "passed" 
      userUID = authData.uid 
      completion(result: testResult, errorDesc: errorStatement)//send the calling function the attached information 
     } 

    } 
}