2016-03-03 25 views
1

我試圖將我從閉包中獲得的值分配給我已經在閉包範圍之外分配的變量。將值從閉包分配到變量Swift

我想這樣做,所以我能夠在我的閉包之外使用這個var,以便整齊,而不是所有這個嵌套代碼在這個閉包裏面。

我正在使用Alamofire進行請求,並使用swify-json來幫助解析json。

,我發現了以下內容:

Error: variable 'userId' captured by a closure before being initialized 

這裏是我的代碼中調用我的閉合功能:

var userId: Int 

get() 
{ 
    data in 
    userId = data["used_id"].intValue 
} 

這是我實現我的get()函數:

func get(param: [String: AnyObject] = [String: AnyObject](), completion: (JSON) ->()) 
{ 
    Alamofire.request(.GET, "apiendpoint.com", parameters: param) 
    .responseJSON 
    { 
     response in 
      switch response.result 
      { 
       case .Success: 
        let jsonData = JSON(data: response.data!) 
        completion(jsonData) 
       case .Failure(let error): 
        print("Request failed with error: \(error)") 
      } 
    } 
} 

謝謝你的幫助!

回答

2

變化var userId: Intvar userId: Int!

的原因是封閉的期待值是在當你「抓住它」變量。通過使用一個強有力的unwrapped變量,閉包將能夠捕獲它,因爲它的值爲nil,然後可以在閉包被調用時分配一個值。

+0

嗯,我已經進一步了!它會立即生成,但如果我嘗試在關閉之外使用我的var(userId),它會崩潰,因爲它仍然爲零。但在關閉userId不是零,這是一個實際值。 – gradedcatfood

+0

我假設你正在試圖訪問這樣的變量: var userId:Int! (userId) 如果是這樣,則在調用print(userId)時,網絡請求並未實際完成,因爲網絡請求是異步的。調用get()後立即調用print,顯然沒有足夠的時間完成請求。解決這個問題的方法是在閉包本身中執行你想用userId變量執行的操作。另外,如果我提供的答案解決了您的問題,請將其打勾爲正確答案。 –

+0

好的,謝謝你的幫助。這有幫助,但我仍然想在我的關閉之外訪問該變量,但我擔心你的權利。在執行打印之前,異步請求未完成。感謝您的幫助:) – gradedcatfood