Saif
Saif

Reputation: 163

Access array outside function in Swift

I am pretty new to Swift.

(a) I have been able to use table view to load numbers from an array into a table.

(b) I have been able to read a text file from the web and load it into an array.

However, I want the array in (b), which is created from the web text file, to be viewed in (a), which is the table view.

There seems no communication between section (a) and (b) in my code.

Could you please help?

//MAIN CLASS

import UIKit

//CHUNK 0
class ViewController: UITableViewController {

var candies = [Candy]()


//CHUNK 1
override func viewDidLoad() {

super.viewDidLoad()

// CHUNK 1.2
let request = NSMutableURLRequest(URL: NSURL(string: "http://www.saifahmad.com/A.txt")!)
httpGet(request){
            (data, error) -> Void in
            if error != nil {
                print(error)
            } else {
                //print(data)//PRINTING ALL DATA TO CONSOLE
                let delimiter = "\t" // Read a tab-delimited text file

                // self.items = []
                let lines:[String] =    data.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()) as [String]

                var ar = [Double]()

                for line in lines {
                    var values:[String] = []
                    if line != "" {
                        values = line.componentsSeparatedByString(delimiter)
                        // Put the values into the tuple and add it to the items array
                        let str = (values[1])//CHOOSE THE COLUMN TO PRINT (0, 1, 2)
                        // Convert string to double
                        let db = NSNumberFormatter().numberFromString(str)?.doubleValue
                        ar.append(db!)
                    }
                }
                dump(ar) // THIS ARRAY 'AR' PRINTS OK HERE BUT CANNOT BE ACCESSED IN CHUNK 1.3
            }
    }
    // CHUNK 1.2


    //CHUNK 1.3
   // CANNOT ACCESS ARRAY 'AR' OF CHUNK 1.2 HERE
    let ar2: [Double] = [0, 0.004, 0.008, 0.012, 0.016, 0.02, 0.024, 0.028, 0.032, 0.036, 0.04]
    for nn in ar2 {
        self.candies.append(Candy(name: String(format:"%.4f", nn)))
    }
    //CHUNK 1.3


}
//CHUNK 1


//CHUNK 2
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
//CHUNK 2


//CHUNK 3
 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.candies.count
}
//CHUNK 3


//CHUNK 4
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
    var candy : Candy
    candy = candies[indexPath.row]
    cell.textLabel?.text = candy.name
    return cell
}
//CHUNK 4


//CHUNK 5
func httpGet(request: NSURLRequest!, callback: (String, String?) -> Void) {
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request){
        (data, response, error) -> Void in
        if error != nil {
            callback("", error!.localizedDescription)
        } else {
            let result = NSString(data: data!, encoding:
                NSASCIIStringEncoding)!
            callback(result as String, nil)
        }
    }
    task.resume()
}
//CHUNK 5


}
//CHUNK 0



//CANDY CLASS
import Foundation

struct Candy {
let name : String
    }

This is the screenshot of the tableview which loads fine from the local array. However, I want the table to load from the Web text file!

Upvotes: 1

Views: 789

Answers (1)

Olivier Wilkinson
Olivier Wilkinson

Reputation: 2856

So your problem is that you declare the array ar inside your closure for the request. So it only exists in the closure. You have two options: make an array outside of viewDidLoad and set it once you have the complete array, then use didSet to set candies, or you can do all the setup for candies inside the closure (see below). I would put a didSet with candies anyways to reload your tableView.

var candies = [Candy]() {
    didSet {
        tableView.reloadData()
    }
}

override func viewDidLoad() {

    super.viewDidLoad()

    // CHUNK 1.2
    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.saifahmad.com/A.txt")!)

    httpGet(request){ (data, error) -> Void in

        if error != nil {

            print(error)

        } else {

            let delimiter = "\t" // Read a tab-delimited text file

            let lines:[String] =    data.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()) as [String]

            var ar = [Double]()

            for line in lines {

                var values:[String] = []

                if line != "" {

                    values = line.componentsSeparatedByString(delimiter)
                    // Put the values into the tuple and add it to the items array

                    let str = (values[1])//CHOOSE THE COLUMN TO PRINT (0, 1, 2)

                    // Convert string to double

                    let db = NSNumberFormatter().numberFromString(str)?.doubleValue

                    ar.append(db!)

                }

            }


            for nn in ar {

                self.candies.append(Candy(name: String(format:"%.4f", nn)))

            }

        }

    }

}

Upvotes: 1

Related Questions