如何将文件名传递给作为数据模型一部分的类



我有一个Swift程序,其ContentView是一个导航视图。导航视图的左侧允许我选择/显示三个视图中的一个,这三个视图是来自3个不同JSON文件的数据图形。这三个视图都使用一个ViewModel和一个DataModel。ViewModels是一个类,DataModels是一个结构,它调用读取JSON文件的类。两个JSON文件具有相同的格式,因此我想消除一个DataModel,这将要求我将文件名传递给DataModel类(只是文件名,扩展名始终是. JSON)。如果有人能给我指出正确的方向,我将不胜感激。下面是其中一个ViewModels和它关联的DataModel。

import Foundation
class VFIAXDataViewModel: ObservableObject {
@Published private var vfiaxDataModel: VFIAXDataModel = VFIAXDataModel()
var timeSeriesDaily : [(Date, Double)] {
return vfiaxDataModel.vfiaxData.timeSeriesData.timeSeriesDaily
}
}
class VFIAXData  {

var timeSeriesData = VFIAXTimeSeriesData(timeSeriesDaily: [])
init() {
getData()
}

func getData() {
guard let url = Bundle.main.url(forResource: "VFIAXData10", withExtension: "json")
else {
print("Json file not found")
return
}
let decoder = JSONDecoder()
do {
let data = try Data(contentsOf: url)
self.timeSeriesData = try decoder.decode(VFIAXTimeSeriesData.self, from: data)
self.timeSeriesData.timeSeriesDaily = self.timeSeriesData.timeSeriesDaily.sorted() { $0 < $1 }
let lastYear: Date = Calendar.current.date(byAdding: .year , value: -1, to: timeSeriesData.timeSeriesDaily[timeSeriesData.timeSeriesDaily.count - 1].0) ?? Date()
var index = 0
for i in 0...(timeSeriesData.timeSeriesDaily.count - 1) {
if timeSeriesData.timeSeriesDaily[i].0 >= lastYear {
index = i
break
} // end if
} // for loop
timeSeriesData.timeSeriesDaily.removeSubrange(0..<index)
} catch {
print(error)
}
}
}
struct VFIAXDataModel {

var vfiaxData = VFIAXData()

}

谢谢你的建议。我最终要做的是将类VFIAXData转换为函数,然后从VFIAXDataModel结构体调用该函数,并在那里传递适当的文件名。现在,我可以从任何适用的数据模型调用该函数。函数和调用如下:

func DailyTimeSeriesData(fileName: String) -> [(Date, Double)] {

var timeSeriesData: [(Date, Double)] = []

guard let url = Bundle.main.url(forResource: fileName, withExtension: "json")
else {
print("Json file not found")
return [(Date(), 2.0)]
}
let decoder = JSONDecoder()
do {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let data = try Data(contentsOf: url)
let decoded = try decoder.decode(TimeSeries.self, from: data)

timeSeriesData = decoded.timeSeries.map { item -> (Date,Double) in
( dateFormatter.date(from: item.key)!, Double(item.value.close) ?? 0.0 )
}.sorted { $0.0 < $1.0 }

let lastYear: Date = Calendar.current.date(byAdding: .year, value: -1, to: timeSeriesData[timeSeriesData.count - 1].0) ?? Date()
var index = 0
for i in 0..<(timeSeriesData.count - 1) {
if timeSeriesData[i].0 >= lastYear {
index = i
break
} // end if
} // for loop
timeSeriesData.removeSubrange(0..<index)
} catch {
print(error)
}
return timeSeriesData
}
struct VOODataModel {

var vooData = DailyTimeSeriesData(fileName: "VOOData10")

}

最新更新