注意我是初学者。使用 Xcode,SwiftUI
我会在这里尽量具体,但也会尽量包含足够的细节来回答一个我什至不知道答案范围的问题。
具体来说,我需要知道如何将数据从 json 解码器获取到全局数组中,以便我可以在 vstack/hstacks 的其他区域引用它。至少那是我认为我需要的。从那里我可以比较和计算它与其他变量。截至目前,它通过 List{} 运行,这似乎是我获取数据的唯一途径。如果我尝试只使用 response.values.open,它会说它不是 [Value] 类型的成员。或者 results = response 和 results.values.open 直接访问一个类别。
List{} 的另一部分也是一个问题,它似乎只将数据打印到控制台,在预览设备屏幕上显示为 Text(),直到我在该屏幕上向下滚动,然后它更新打印到控制台的内容。我需要能够在需要时立即访问每个类别的整个集合。
我只是将我的其他变量带入列表,但它不允许从 List{} 内部附加数组。
看起来应该是一个非常简单的问题,但我已经尝试了好几天了
我被要求发布代码,虽然我已经从那里处理了许多其他细节,但与我所问的内容相关的基本结构与以前的代码相同,所以我将发布它。我觉得基本是从自动补全json代码的网站上抄来的
我已经尝试过通常的方法,在线搜索等
另外,我不想在这里添加太多信息,因为它可能不够具体,但以防万一它对答案很重要,之前讨论的 json 数据将成为涉及从 textField 获得的其他变量的计算的一部分()s,这意味着用户在设备屏幕上输入。仅供参考
struct ContentView: View {
@State var results: Response?
@State var busy = true
var body: some View {
VStack {
if busy {
ProgressView()
} else {
if let response = results {
HStack {
Text("Symbol: \(response.meta.symbol)\nInterval: \(response.meta.interval)\nCurrency_base: \(response.meta.currencyBase)\nCurrency_quotes: \(response.meta.currencyQuote)")
Spacer()
}
List(response.values){ val in
VStack (alignment: .leading){
Text("low: " + val.low)
Text("high: " + val.high)
Text("close: " + val.close).foregroundColor(.red)
}
}
}
}
}
.task {
let apikey = "YOUR-API-KEY"
let baseUrl = "https://api.twelvedata.com/time_series?apikey=\(apikey)&interval=1min&symbol=EUR/USD&dp=5&timezone=utc&start_date=2023-01-30%2010:05:00&end_date=2023-03-03%2010:06:00&format=JSON"
if let url = URL(string: baseUrl) {
do {
let (data, _) = try await URLSession.shared.data(from: url)
results = try JSONDecoder().decode(Response.self, from: data)
}
catch { print(error) }
busy = false
} else {
print("---> error bad url: \(baseUrl)")
}
}
}
}
struct Response: Codable {
let meta: Meta
let values: [Value]
let status: String
}
struct Meta: Codable {
let symbol, interval, currencyBase, currencyQuote: String
let type: String
enum CodingKeys: String, CodingKey {
case symbol, interval
case currencyBase = "currency_base"
case currencyQuote = "currency_quote"
case type
}
}
struct Value: Identifiable, Codable {
let id = UUID()
let datetime, valueOpen, high, low: String
let close: String
enum CodingKeys: String, CodingKey {
case datetime
case valueOpen = "open"
case high, low, close
}
}
I’ve tried many many pages online and different tutorials and browsed questions, but mostly I’ve tried trial and error from there and I just don’t get this.