Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 结构内部结构均衡计数重复项Swift_Arrays_Swift_Struct_Swift5_Equatable - Fatal编程技术网

Arrays 结构内部结构均衡计数重复项Swift

Arrays 结构内部结构均衡计数重复项Swift,arrays,swift,struct,swift5,equatable,Arrays,Swift,Struct,Swift5,Equatable,我找到的答案是一级结构。在我的代码中,我想知道结构的内部有多少相同的日期。我以前从未使用equatable,所以我不知道如何在struct中使用struct实现它 我使用的是Charts pod,数组chartMetricItemSets包含多天的不同读数。例如:[“名称”:糖,[[“日期”:“10月10日”,“价值”:120],“日期”:“10月10日”,“价值”:121],“日期”:“10月11日”,“价值”:120],“日期”:“10月13日”,“价值”:120],“日期”:“10月13日

我找到的答案是一级结构。在我的代码中,我想知道结构的内部有多少相同的日期。我以前从未使用equatable,所以我不知道如何在struct中使用struct实现它

我使用的是Charts pod,数组
chartMetricItemSets
包含多天的不同读数。例如:
[“名称”:糖,[[“日期”:“10月10日”,“价值”:120],“日期”:“10月10日”,“价值”:121],“日期”:“10月11日”,“价值”:120],“日期”:“10月13日”,“价值”:120],“日期”:“10月13日”,“价值”:121]
xaxisdate
将是
[“10月10日”,“10月11日”,“10月13日”]

x代表日期,y代表同一日期

目标:chartDataEntries应该附加
[x:0(10/10),y:241],[x:1(10/11),y:120],[x:2(10/13),y:241]

谢谢大家!

struct ChartData {
   let name: String
   let value: [ChartValue]
}

struct ChartValue {
    let date: Date
    let value: Double
 }

var chartMetricItemSets = [[ChartData]]()
var xAxisDates = [String]() //date array

func getChartDataSets() {
    for (index, chartHealthItemSet) in chartMetricItemSets.enumerated() {
        let dataSourceSelected = dataSourcesSelected[index]
        var chartDataEntries = [ChartDataEntry]() //array display on graph
        var chartYaxis: Double = 0
        var datePoint: Int = 0
        var countChartYaxis = 0
        var duplicateDateCount = 0

        for (index, item) in chartHealthItemSet[0].value.enumerated() {
            for (dateIndex, date) in xAxisDates.enumerated() {
                if item.date.convertDateToString(dateFormat: .monthDay) == date {
                    chartYaxis += item.value
                    datePoint = dateIndex
                    chartYaxis += 1
                    break
                }

                //missing counting duplicateDateCount 

                if duplicateDateCount == countChartYaxis {
                    chartDataEntries.append(ChartDataEntry(x: Double(datePoint), y: chartYaxis.roundUpNDecimal(n: 2)))
                }
            }
            print("chartYaxis: \(chartYaxis)")
            print("chartDataEntries: \(chartDataEntries)")
        }
        chartDataEntries.sort(by: { $0.x < $1.x })

        let set = LineChartDataSet(entries: chartDataEntries,
                                   label: HEALTH_TABLE.allCases[dataSourceSelected].info.name)

        set.mode = .linear // cubic line effect (smoother)
        set.colors = [HEALTH_TABLE.allCases[dataSourceSelected].info.chartColor]
        set.setCircleColor(.black)
        set.lineWidth = 1.5
        set.circleRadius = 3
        set.drawCircleHoleEnabled = false
        set.drawCirclesEnabled = true
        set.drawHorizontalHighlightIndicatorEnabled = true

        lineChartData?.addDataSet(set)
    }

    chartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: xAxisDates)
    chartView.xAxis.granularity = 1
    chartView.xAxis.axisMinLabels = 4
    chartView.xAxis.axisMaxLabels = 6

    DispatchQueue.main.async {
        self.chartView.data = self.lineChartData
    }
}
结构图表数据{ let name:String let value:[图表值] } 结构图表值{ 日期:日期 让值加倍 } var chartMetricItemSets=[[ChartData]]() var xAxisDates=[String]()//日期数组 func getChartDataSets(){ 对于chartMetricItemSets.enumerated()中的(索引,chartHealthItemSet){ 让dataSourceSelected=dataSourceSelected[index] var chartDataEntries=[ChartDataEntry]()//数组显示在图形上 变量chartYaxis:Double=0 变量日期点:Int=0 var countChartYaxis=0 var duplicateDateCount=0 对于chartHealthItemSet[0]中的(索引,项)。值。枚举(){ 对于xAxisDates.enumerated()中的(dateIndex,date){ 如果item.date.convertDateToString(日期格式:.monthDay)=日期{ chartYaxis+=项值 datePoint=dateIndex chartYaxis+=1 打破 } //缺少计数重复日期计数 如果duplicateDateCount==countChartYaxis{ append(ChartDataEntry(x:Double(datePoint),y:chartYaxis.roundUpNDecimal(n:2))) } } 打印(“chartYaxis:\(chartYaxis)”) 打印(“chartDataEntries:\(chartDataEntries)”) } 排序(按:{$0.x<$1.x}) 设为set=LineChartDataSet(条目:chartDataEntries, 标签:HEALTH_TABLE.allCases[dataSourceSelected].info.name) set.mode=.linear//立方线效果(更平滑) set.colors=[HEALTH_TABLE.allCases[dataSourceSelected].info.chartColor] set.setCircleColor(.black) set.lineWidth=1.5 set.circleRadius=3 set.drawCircleHoleEnabled=false set.drawCircleEnabled=true set.drawHorizontalHighlightIndicatorEnabled=true lineChartData?.addDataSet(集) } chartView.xAxis.valueFormatter=索引xaxisValueFormatter(值:xAxisDates) chartView.xAxis.granularity=1 chartView.xAxis.axisMinLabels=4 chartView.xAxis.axisMaxLabels=6 DispatchQueue.main.async{ self.chartView.data=self.lineChartData } }
在Swift 4中,引入了一个有用的API,通过任意谓词将数组分组到字典中

您可以分组
chartHealthItemSet[0]

let grouped = Dictionary(grouping: chartHealthItemSet[0], by: {$0.date.convertDateToString(dateFormat: .monthDay)}
结果是
[“10/10”:[ChartData],“10/11”:[ChartData],…]

对键进行排序并将其分配给
xAxisDates

xAxisDates = grouped.keys.sorted()
要获取值的总和,请从日期键的分组字典中获取数组,将其映射到值并求和

for (index, date) in xAxisDates.enumerated() {
    let sum = grouped[date]!.map{$0.value}.reduce{0.0, +}
    chartDataEntries.append(ChartDataEntry(x: Double(index), y: sum.roundUpNDecimal(n: 2)))
}

您好!谢谢您的回答,但当我键入第一行时,出现了“表达式类型不明确,没有更多上下文”错误。让分组=…我知道了!更改一点后:)非常感谢!!