Ios 无法将元素添加到数组中
我是Swift新手,在向数组添加元素时遇到问题 我试图将6个对象从JSON存储到数组。但数组为零 当我调试它时,我看到它被添加到数组中,我不知道为什么在完成JSON请求后它是零 JSON: 服务: 黄金等级: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
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()
}
}