Json 错误导致代码崩溃:Can';t从空集合中删除最后一个元素
我正在尝试绘制一些数据图表,下面的代码最初是有效的,有时也会起作用,但现在它似乎大部分都崩溃了,我认为json函数中的if let data=data行意味着它只有在收到数据后才会运行。我有一种感觉,也许函数在完全加载之前正在展开数据,但我不确定Json 错误导致代码崩溃:Can';t从空集合中删除最后一个元素,json,swift,xcode,Json,Swift,Xcode,我正在尝试绘制一些数据图表,下面的代码最初是有效的,有时也会起作用,但现在它似乎大部分都崩溃了,我认为json函数中的if let data=data行意味着它只有在收到数据后才会运行。我有一种感觉,也许函数在完全加载之前正在展开数据,但我不确定 import SwiftUI import SwiftUICharts struct CoinGeckoBSVMarketChart: View { // @State var jsonData = [MarketChart]() @S
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(urlString:String,completion:@escaping(T?)->Void){
guard let url=url(字符串:urlString)else{
返回
}
let request=URLRequest(url:url)
URLSession.shared.dataTask(带:请求){(数据、响应、错误)在
如果let error=error{
打印(错误。本地化描述)
完成(无)
返回
}
guard let data=其他数据{
完成(无)
返回
}
let decoder=JSONDecoder()
decoder.dateDecodingStrategy=.secondsSince1970
guard let decodedData=try?decoder.decode(T.self,from:data)else{
完成(无)
返回
}
完成(解码数据)
}1.简历()
}
在每个参数中都有一个双精度的时间戳和值,现在我只想恢复这个值。
任何帮助都将是非常好的,谢谢你你需要安全地添加它,以防里面有一个空元素
让价格:[[Double]]
for item in data.prices {
if let res = item.last {
priceArray.append(res)
}
}
我遇到了完全相同的问题,解决方法是避免在for循环中附加到标有@State的数组。我只能假设这样做会导致不必要的行为,因为观察状态的所有内容都会在每次修改数组时得到通知。因此,对我来说,解决这个问题的方法是:
var tempPriceArray = [Double]()
for item in data.prices {
tempPriceArray.append(item.last!)
}
priceArray = tempPriceArray
请共享崩溃报告2020-07-28 00:27:50.374395+0100 Stonks[8280:1495571]libMobileGestalt MobileGestaltCache.c:166:缓存加载了4518个缓存数据中的预缓存项和45个缓存额外项。致命错误:无法从空集合中删除最后一个元素:file/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1200.2.22.2/swift/stdlib/public/core/rangereplacablecollection.swift,第854行Stonks[8280:1495415]致命错误:无法从空集合中删除最后一个元素:file/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang collection.swift,第854行我得到的错误是线程1:致命错误:无法从空位置删除最后一个元素我在任何代码中都不使用删除,我想这是指最后一个in item.last,当我们附加array@HenryHudson你有没有弄明白他的意思。我也有同样的问题。你能解决这个问题吗?不,我仍然没有让它工作,这是一个奇怪的错误,可能是一个Xcode错误?很可能你在这里遗漏了一些东西。您在这里提供的代码没有任何问题,您可能没有在这里共享整个代码。试着对你所面临的问题做一个简单的描述。
var tempPriceArray = [Double]()
for item in data.prices {
tempPriceArray.append(item.last!)
}
priceArray = tempPriceArray