Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法将元素添加到数组中_Ios_Arrays_Json_Swift_Alamofire - Fatal编程技术网

Ios 无法将元素添加到数组中

Ios 无法将元素添加到数组中,ios,arrays,json,swift,alamofire,Ios,Arrays,Json,Swift,Alamofire,我是Swift新手,在向数组添加元素时遇到问题 我试图将6个对象从JSON存储到数组。但数组为零 当我调试它时,我看到它被添加到数组中,我不知道为什么在完成JSON请求后它是零 JSON: 服务: 黄金等级: class Gold{ let amount:String let date: String init(amount: String, date: String) { self.amount = amount self.da

我是Swift新手,在向数组添加元素时遇到问题

我试图将6个对象从JSON存储到数组。但数组为零

当我调试它时,我看到它被添加到数组中,我不知道为什么在完成JSON请求后它是零

JSON:

服务:

黄金等级:

    class Gold{
    let amount:String
    let date: String

    init(amount: String, date: String) {
        self.amount = amount
        self.date = date
    }

}
视图控制器:

    class ViewController: UIViewController {
    //var dataArray = [Gold]()
    override func viewDidLoad() {
        super.viewDidLoad()
        DownloadService.instance.getData()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
此处,从闭包外部调用printGoldArray函数,这意味着调用printGoldArray时,goldArray可能没有任何值

添加值后,尝试从闭包内部调用printGoldArray函数。请尝试下面的代码

func getData() {
    Alamofire.request("https://rth-recruitment.herokuapp.com/api/prices/chart_data", headers: headers).responseJSON { response in
        if let objJson = response.result.value as! NSArray?{
            for element in objJson {
                let data = element as! NSDictionary
                let amount = data["amount"] as! String
                let date = data["date"] as! String
                let gold = Gold(amount: amount, date: date)
                self.goldArray.append(gold)
                print(self.goldArray.count)//print 1 to 6
            }
        }
     printGoldArray()
    }

}

在获取值之前,需要首先解析JSON数据

do{
    let json = try JSONSerialization.jsonObject(with: response.result.value, options: []) as? [Any]
    let firstObj = json?[0] as! [String: String]
    let amount = firstObj["amount"]
    dump(amount)
}catch let error{

}

然后,在执行闭包之前,HTTP调用不会获得返回值。所以,要打印数组,需要在闭包内部执行。例如,您可以在json解析之后立即执行此操作,首先调用printGoldArray,您的数组不是print数组元素,因为您在闭包后直接打印它。闭包使用异步范例。所以把print函数放在闭包中

第二件事是为什么要用很大的力量完全展开。相反,您可以使用if-let或guard语句

您可以看到下面的代码

func getData() {
        Alamofire.request("https://rth-recruitment.herokuapp.com/api/prices/chart_data", headers: headers).responseJSON { response in
            if let objJson = response.result.value as? NSArray {
                for element in objJson {
                    if let data = element as? NSDictionary {
                        let amount = data["amount"] as! String
                        let date = data["date"] as! String
                        let gold = Gold(amount: amount, date: date)
                        self.goldArray.append(gold)
                        print(self.goldArray.count)
                    }
                }
            }
            printGoldArray()
        }
    }

这是因为您缺少异步概念。如果在printself.goldArray.count之前添加printin alamofire闭包,并在printGoldArray之前添加printcalling print,您将看到打印顺序与预期的顺序不同。寻找Swift+Closure+Async。为什么要强制将可选的展开为可选的!NSArray??实际上,我的目的是在其他方法中使用goldArray[],所以我将其声明为全局var,但till无法获取数据。那么有什么方法可以使用它吗?你也可以在func getData中使用闭包,在其完成闭包时,你可以使用我在func getData之外使用的goldArray?是的,你可以在getData之外使用goldArray,但只能在执行alamofire的完成块/closure之后使用。这就是为什么我的goldArray当时为[]nil?我如何知道Alamofire关闭的执行已完成?
do{
    let json = try JSONSerialization.jsonObject(with: response.result.value, options: []) as? [Any]
    let firstObj = json?[0] as! [String: String]
    let amount = firstObj["amount"]
    dump(amount)
}catch let error{

}
func getData() {
        Alamofire.request("https://rth-recruitment.herokuapp.com/api/prices/chart_data", headers: headers).responseJSON { response in
            if let objJson = response.result.value as? NSArray {
                for element in objJson {
                    if let data = element as? NSDictionary {
                        let amount = data["amount"] as! String
                        let date = data["date"] as! String
                        let gold = Gold(amount: amount, date: date)
                        self.goldArray.append(gold)
                        print(self.goldArray.count)
                    }
                }
            }
            printGoldArray()
        }
    }