由于错误导致代码崩溃:无法从空集合中删除最后一个元素



我正在尝试绘制一些数据的图表,下面的代码最初是有效的,有时也能正常工作,但现在它似乎大多崩溃了,我认为json函数中的iflet data=data行意味着它只会在收到数据后运行。我有一种感觉,也许函数在完全加载之前就打开了数据,但我不确定。

import SwiftUI
import SwiftUICharts
struct CoinGeckoBSVMarketChart: View {
// @State var jsonData = [MarketChart]()
@State var priceArray = [Double]()
@State var volumeArray: [Double] = []

private let last24hpricesURL: String = "https://api.coingecko.com/api/v3/coins/bitcoin-cash-sv/market_chart?vs_currency=usd&days=1"

var body: some View {
ZStack {
VStack {
LineView(data: priceArray)
.padding()

Text("Reset")
.onTapGesture {
// will add a tap to refresh data by resetting the array to empty then retuning the getJSON 
}
}
}
.onAppear {
getJSON(urlString: last24hpricesURL) { (data: MarketChart?) in
if let data = data {
for item in data.prices {
priceArray.append(item.last!)  // It worked the first time and still on occasion but error prone, and works in playground
}
}
}
}
}
}
struct MarketChart: Decodable {
let prices: [[Double]]
let market_caps: [[Double]]
let total_volumes: [[Double]]
}
struct CoinGeckoBSVMarketChart_Previews: PreviewProvider {
static var previews: some View {
CoinGeckoBSVMarketChart()
.preferredColorScheme(.dark)
}
}

如果需要,这里是getJSON供参考:

func getJSON<T: Decodable>(urlString: String, completion: @escaping (T?) -> Void) {
guard let url = URL(string: urlString) else {
return
}
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { (data, response, error) in
if let error = error {
print(error.localizedDescription)
completion(nil)
return
}
guard let data = data else {
completion(nil)
return
}

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970
guard let decodedData = try? decoder.decode(T.self, from: data) else {
completion(nil)
return
}
completion(decodedData)
}.resume()
}

在每个参数中都有一个时间戳和值的双值,现在我只是想恢复这个值。任何帮助都将是非常棒的,谢谢

我遇到了完全相同的问题,修复方法是避免在for循环中附加到标有@State的数组。我只能假设这样做会导致不必要的行为,因为每次修改数组时,观察状态的所有东西都会得到通知。所以,对我来说,修复它的是这样做:

var tempPriceArray = [Double]()
for item in data.prices {
tempPriceArray.append(item.last!)  
}
priceArray = tempPriceArray

您需要安全地添加它,以防let prices: [[Double]]中有空元素

for item in data.prices {
if let res = item.last {
priceArray.append(res) 
}
}

最新更新