How do I access variables that are inside closures in Swift?

I’m new to Swift and I’m trying to get the result from this function. I don’t know how to access variables that are inside the closure that is passed to the sendAsynchronousRequest function from outside the closure. I have read the chapter on closures in the Apple Swift guide and I didn’t find an answer and I didn’t find one on StackOverflow that helped. I can’t assign the value of the ‘json’ variable to the ‘dict’ variable and have that stick outside of the closure.

    var dict: NSDictionary!
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response, data, error) in
        var jsonError: NSError?
        let json = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: &jsonError) as? NSDictionary
        dict = json
        print(dict) // prints the data
    })
    print(dict) // prints nil

  • Application not automatically launching in device and getting error on xcode
  • Malformed or corrupted AST file
  • What will happen if I have nested dispatch_async calls?
  • Unable to read/write values to Nest Firebase with newest Firebase Framework
  • How to capitalize each word in a string using Swift iOS
  • How can I save a JSON response to a file that would be accessible from within a local HTML file loaded inside UIWebWiew
  • 2 Solutions Collect From Internet About “How do I access variables that are inside closures in Swift?”

    var dict: NSDictionary! // Declared in the main thread
    

    The closure is then completed asynchronously so the main thread doesn’t wait for it, so

    println(dict)
    

    is called before the closure has actually finished. If you want to complete another function using dict then you will need to call that function from within the closure, you can move it into the main thread if you like though, you would do this if you are going to be affecting UI.

    var dict: NSDictionary!
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response, data, error) in
        var jsonError: NSError?
        let json = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: &jsonError) as? NSDictionary
        dict = json
        //dispatch_async(dispatch_get_main_queue()) { //uncomment for main thread
            self.myFunction(dict!)
        //} //uncomment for main thread
    })
    
    func myFunction(dictionary: NSDictionary) {
        println(dictionary)
    }
    

    You are calling an asynchronous function and printing act without waiting for it to finish. In other words, when print(dict) is called, the function hasn’t complete execution(hencedict is nil)

    Try something like

    var dict: NSDictionary!
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response, data, error) in
        var jsonError: NSError?
        let json = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: &jsonError) as? NSDictionary
        dict = json
        doSomethingWithJSON(dict)
    })
    

    and put your JSON logic inside a doSomethingWithJSON function:

    void doSomethingWithJSON(dict: NSDictionary) {
        // Logic here
    }
    

    This ensures that your logic is execute only after the URL request completes.