ios - 来自另一个类的变量

标签 ios swift class

从另一个类访问变量时遇到问题。

我在这里初始化和修改变量

响应类

import Foundation
import Alamofire

class TheResponse {

typealias JSONStd = [[String : AnyObject]]
var jsonAnswer = [[String:String]]()

var getRes: [[String : String]] {
    return jsonAnswer
}

func callAmo(){
    let urladdress = "https://api.github.com/users"
    Alamofire.request(urladdress).responseJSON(completionHandler: {
        response in
        //print(response)
        self.parseData(JSONData: response.data!)
    })
}

func parseData(JSONData : Data){

    do {
        var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStd
            let counter = readableJSON.count
 //Filling the dictionary
        for item in 0...counter - 1 {
            let login = readableJSON[item]["login"]
            let avatar_url = readableJSON[item]["avatar_url"]
            let html_url = readableJSON[item]["html_url"]
            let id = String(describing: readableJSON[item]["id"])

            var dict:[String:AnyObject] = ["login": login!,
                        "avatar": avatar_url!,
                        "profile": html_url!,
                        "id": id as AnyObject]

            jsonAnswer.append(dict as! [String : String])
        }
    }
    catch{
        print(error)
    }
}
}

如果我在此处打印 jsonAnswer 变量,一切看起来都很好。 但我想在我的第二堂课中使用这个变量

import UIKit
import Alamofire

class TableViewController: UITableViewController {
var resObj = TheResponse()
var jsonData = [[String:String]]()


override func viewDidLoad() {
    super.viewDidLoad()

    resObj.callAmo{ (jsonAns) -> () in
        self.jsonData = jsonAns
       // print(self.jsonData)
    }
    print(self.jsonData)

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MainViewCell

    return cell
}

}

问题是,当我想打印 TableViewController 类中的变量时,该变量为空。打印出来我只得到[]。

我应该如何访问变量才能使其保持应有的样子?

最佳答案

问题是您还没有调用 callAmo 方法,您需要使用您的方法创建完成闭包,因此请像这样更改代码。

func callAmo(completion: ([[String : String]]) -> ()) {
    let urladdress = "https://api.github.com/users"
    Alamofire.request(urladdress).responseJSON(completionHandler: {
        response in
        //print(response)
        let dic = self.parseData(JSONData: response.data!)
        completion(dic)
    })
}

现在从这样的 parseData 方法返回字典。

func parseData(JSONData : Data) -> [[String: String]]{

    do {
        var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStd
        let counter = readableJSON.count
         //Filling the dictionary
        for item in 0...counter - 1 {
            let login = readableJSON[item]["login"]
            let avatar_url = readableJSON[item]["avatar_url"]
            let html_url = readableJSON[item]["html_url"]
            let id = String(describing: readableJSON[item]["id"])

            var dict:[String:AnyObject] = ["login": login!,
                    "avatar": avatar_url!,
                    "profile": html_url!,
                    "id": id as AnyObject]

            jsonAnswer.append(dict as! [String : String])
        } 
    }
    catch{
        print(error)
    }
    return jsonAnswer
}

现在在 TableViewControllerviewDidLoad 中调用这个方法,如下所示。

resObj.callAmo{ (jsonAns) -> () in
    print(jsonAns)
}

编辑:要获取TableViewController中的数据,请执行以下操作

var jsonData = [[Strin:String]]()

override func viewDidLoad() {
    super.viewDidLoad()

    resObj.callAmo{ (jsonAns) -> () in
        self.jsonData = jsonAns
        self.tableView.reloadData()
    }
}

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.jsonData.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MainViewCell
    return cell
}

关于ios - 来自另一个类的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39505874/

相关文章:

ios - UIBezierPath:在 iPad 上创建的控制点多于 iPhone?

xcode - 照片每天都在变化(Xcode, Swift)

java - 将运行时对象的类传递给 java 中的泛型字段

ios - 弹出 View Controller 后出现的标签栏

ios - 在没有 use_frameworks 的情况下使用 cocoapods!在 swift

ios - 如何禁用向后/向左滑动手势?

swift - 使用非托管<AnyObject>!作为 NSMutableDictionary 中的键

swift - 为什么不能在没有警告的情况下将 Optional 分配给类型为 `Any` 的变量?

javascript - 创建在后台与 Promises 一起使用的 EventEmitter 的正确方法

Eiffel 中的类属性