Ios swift 2如何在函数外使用变量?

Ios swift 2如何在函数外使用变量?,ios,swift,swift2,Ios,Swift,Swift2,我有一个类apimager(),它向JSON数据发出请求,我从中了解到,该类使用协议委托方法将数据传递给ViewController类 数据采集很好,但我不知道如何使用它?!在本例中,我尝试在TableView中使用它 class ViewController: UITableViewController, ApiManagerDelegate{ var names:[String] = [] // the variable which will hold the JSON data ov

我有一个类apimager(),它向JSON数据发出请求,我从中了解到,该类使用协议委托方法将数据传递给ViewController类

数据采集很好,但我不知道如何使用它?!在本例中,我尝试在TableView中使用它

class ViewController: UITableViewController, ApiManagerDelegate{

var names:[String] = []  // the variable which will hold the JSON data

override func viewDidLoad() {
    super.viewDidLoad()
    
    //instantiate the ApiManager Class
    //Set the ViewController as its delegate
    //perform request to Restaurants info
    
    let manager = ApiManager()
    manager.delegate = self
    manager.getRestaurantsData()

    func didReceiveResponse (info: [String : AnyObject]){
        
        //Read name property from data dictionary (JSON)
        
        if let restaurantsData = info["restaurants"] as? [[String: AnyObject]]{
            
            for restaurant in restaurantsData{
                let name = restaurant["name"] as? String
                self.names.append(name!)
            }
        }
        
 
        print("Data1: \(names)") // prints the data perfectly
        
    }

    func didFailToReceiveResponse() {
        print("There was an error in recieving API data")
    }

}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    print (names) //no data here
    return names.count //not working
}
我有点困惑如何解决这个问题,我尝试将返回值设置为didReieveResponse(),但问题是当我调用函数时,它需要参数(在Delegator类“dictionary”中传递给它)。。我完全糊涂了

以下是delegator类和协议供参考:

import UIKit

//Custom Protocol Declaration
@objc protocol ApiManagerDelegate {
    optional func didReceiveResponse(info: [ String : AnyObject ])
    optional func didFailToReceiveResponse()
}


class ApiManager: NSObject, NSURLSessionDelegate {

//open restaurant web API
private let requestURL = NSURL(string:"http://some-url-here.com")

var delegate: ApiManagerDelegate?

override init() {
    
    super.init()
    
}

func getRestaurantsData() {
    
    let defaultConfigObject = NSURLSessionConfiguration.defaultSessionConfiguration()
    
    let defaultSession = NSURLSession (configuration: defaultConfigObject, delegate: self, delegateQueue: NSOperationQueue.mainQueue ())
    
    let request = NSMutableURLRequest(URL: requestURL!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringCacheData, timeoutInterval: 60 )
    
    

    request.HTTPMethod = "POST"
    request.setValue( "application/x-www-form-urlencoded" , forHTTPHeaderField: "Content-Type" )
    
    let dataTask = defaultSession.dataTaskWithRequest(request, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) in
        
            if let responseError = error {
               
                self.delegate?.didFailToReceiveResponse?()
                print("Reponse Error: \( responseError )" )
                
                } else {
                    do {
                        let dictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! [String: AnyObject]
                        
                        self.delegate?.didReceiveResponse?(dictionary)
                        //print( "Response: \( dictionary )" )
                        print("Response: Success")
                        
                    } catch let jsonError as NSError {
                        // Handle parsing error
                        self.delegate?.didFailToReceiveResponse?()
                        print( "JSONError: \(jsonError.localizedDescription)")
                    }
                }
            })
            
            dataTask.resume()
}
}

谢谢


更新: 对于像我这样的未来开发人员,解决方案是使用TableViewName.reloadData(),如下所述。。 但请注意,只有当我将didReceiveResponse()函数放在ViewDidLoad之外时,它才对我起作用,我不知道为什么希望有一位专家稍后能解释它

享受吧

你喜欢什么

 class ViewController: UITableViewController, ApiManagerDelegate{

var names:[String] = []  
 let manager = ApiManager()


 override func viewDidLoad() {
    super.viewDidLoad()

    manager.delegate = self
    manager.getRestaurantsData()
 }

   func didReceiveResponse (info: [String : AnyObject]){

        //Read name property from data dictionary (JSON)

        if let restaurantsData = info["restaurants"] as? [[String: AnyObject]]{

            for restaurant in restaurantsData{
                let name = restaurant["name"] as? String
                self.names.append(name!)
            }

                print("Data1: \(names)") // prints the data perfectly
             if (self.names.count>0)
             { 
              yourtableview.reloadData()
             }
        }

    }


  func didFailToReceiveResponse() {
    print("There was an error in recieving API data")
}
喜欢

 class ViewController: UITableViewController, ApiManagerDelegate{

var names:[String] = []  
 let manager = ApiManager()


 override func viewDidLoad() {
    super.viewDidLoad()

    manager.delegate = self
    manager.getRestaurantsData()
 }

   func didReceiveResponse (info: [String : AnyObject]){

        //Read name property from data dictionary (JSON)

        if let restaurantsData = info["restaurants"] as? [[String: AnyObject]]{

            for restaurant in restaurantsData{
                let name = restaurant["name"] as? String
                self.names.append(name!)
            }

                print("Data1: \(names)") // prints the data perfectly
             if (self.names.count>0)
             { 
              yourtableview.reloadData()
             }
        }

    }


  func didFailToReceiveResponse() {
    print("There was an error in recieving API data")
}

您在ViewDidLoad方法中定义了这些方法?您可以使用闭包进行回调,这可能是因为绘制tableview时名称不存在?也许在viewdidload之后在tableview中重新加载数据会有所帮助,或者在ViewWillDisplay中获取名称?tableview.reloaddata();-)tableview.reloadData()我认为您应该按照本教程进行API调用和JSON处理您在ViewDidLoad方法中定义了方法?您可以使用闭包进行回调可能是因为绘制tableview时名称不存在吗?也许在viewdidload之后在tableview中重新加载数据会有所帮助,或者在ViewWillDisplay中获取名称?tableview.reloaddata();-)reloadData()我认为您应该使用遵循本教程的API调用和JSON处理方法。如果我没有弄错,您希望我将manager=apimager()置于viewdidload之外。我刚刚试过并测试过,但没有输出这是ApiManager类的初始化,您需要在其中添加并没有问题OK,我制作了tableView.reloadData()。。不工作我不确定我是否做对了!yourtableview=tableview标识符?您的tableview==yourtableviewName,因此这是名称=mainList@IBOutlet var mainList:UITableView!仍然不工作如果我做对了,您希望我将manager=apimager()放在viewdidload之外。我刚刚试过并测试过,但没有输出这是ApiManager类的初始化,您需要在其中添加并没有问题OK,我制作了tableView.reloadData()。。不工作我不确定我是否做对了!yourtableview=tableview标识符?您的tableview==yourtableviewName,因此这是名称=mainList@IBOutlet var mainList:UITableView!仍然不起作用