Swift,将数组分配给变量的问题
Swift, issue assigning array to variable
所以我有这个文件,它从 api 端点获取一个 JSON 数组,然后应该将它分配给一个可观察的对象变量,以便它可以在 foreach 中检索和迭代环形。我对 Swift 还是很陌生,但看起来确实如此;
import SwiftUI
import Combine
import Foundation
public struct ActivityModel: Codable {
public let id: Int
public let name: String
public let activity_desc: String?
}
public struct ActivitiesModel2: Codable {
public let location: String
public let popular: [String:ActivityModel]
}
public struct ActivitiesModel: Codable {
public let activities: ActivitiesModel2
}
public class ActivityFetcher: ObservableObject {
var activities: [ActivitiesModel]()
init(){
guard let url = URL(string: "http://mywebsite.com/api/loadapi") else { return }
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "POST"
URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
do {
if let d = data {
let decodedLists = try JSONDecoder().decode(ActivitiesModel.self, from: d)
DispatchQueue.main.async {
self.activities = [decodedLists]
}
print(self.activities)
print(decodedLists)
} else {
print("No Data")
}
} catch {
print("Error")
}
}.resume()
}
}
在我尝试将 self.activities 等同于 decodedLists 之前,代码工作正常,因为在打印 decodedLists returns 时 JSON API 中的正确数组,在我将其定义为等于 decodedLists 之后打印 self.activities returns:“[]”。为什么它 returns 一个空数组,当它在打印 decodedLists 时被明确定义是超出我的范围。我尝试删除括号,认为它可能将字典转换为数组并失败,但我无法在不返回错误的情况下删除任何括号。
很简单;它只与 what async means 有关。这些代码行按以下顺序执行:
DispatchQueue.main.async {
self.activities = [decodedLists] // 2
}
print(self.activities) // 1
所以首先你读取并打印 self.activities
,它是空的,然后一段时间后你给它一个值 [decodedLists]
。
所以我有这个文件,它从 api 端点获取一个 JSON 数组,然后应该将它分配给一个可观察的对象变量,以便它可以在 foreach 中检索和迭代环形。我对 Swift 还是很陌生,但看起来确实如此;
import SwiftUI
import Combine
import Foundation
public struct ActivityModel: Codable {
public let id: Int
public let name: String
public let activity_desc: String?
}
public struct ActivitiesModel2: Codable {
public let location: String
public let popular: [String:ActivityModel]
}
public struct ActivitiesModel: Codable {
public let activities: ActivitiesModel2
}
public class ActivityFetcher: ObservableObject {
var activities: [ActivitiesModel]()
init(){
guard let url = URL(string: "http://mywebsite.com/api/loadapi") else { return }
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "POST"
URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
do {
if let d = data {
let decodedLists = try JSONDecoder().decode(ActivitiesModel.self, from: d)
DispatchQueue.main.async {
self.activities = [decodedLists]
}
print(self.activities)
print(decodedLists)
} else {
print("No Data")
}
} catch {
print("Error")
}
}.resume()
}
}
在我尝试将 self.activities 等同于 decodedLists 之前,代码工作正常,因为在打印 decodedLists returns 时 JSON API 中的正确数组,在我将其定义为等于 decodedLists 之后打印 self.activities returns:“[]”。为什么它 returns 一个空数组,当它在打印 decodedLists 时被明确定义是超出我的范围。我尝试删除括号,认为它可能将字典转换为数组并失败,但我无法在不返回错误的情况下删除任何括号。
很简单;它只与 what async means 有关。这些代码行按以下顺序执行:
DispatchQueue.main.async {
self.activities = [decodedLists] // 2
}
print(self.activities) // 1
所以首先你读取并打印 self.activities
,它是空的,然后一段时间后你给它一个值 [decodedLists]
。