【问题标题】:NSArray element failed to match the Swift Array Element type - Objective-C With Swift Library (Charts)NSArray 元素无法匹配 Swift 数组元素类型 - Objective-C 与 Swift 库(图表)
【发布时间】:2026-02-04 17:10:01
【问题描述】:

我正在使用 iOS 图表库,但遇到以下错误消息:

致命错误:NSArray 元素无法匹配 Swift Array 元素类型

我正在尝试使用以下 Objective-C 代码实现折线图:

NSMutableArray *dataSets = [[NSMutableArray alloc] init];
set1 = [[LineChartDataSet alloc] initWithValues:yVals];
[dataSets addObject:set1];
LineChartData *data = [[LineChartData alloc] initWithDataSets:dataSets];
_chartView.data = data;

ChartViewBase.swift 文件中的这一行出现错误。

for set in _data!.dataSets

_dataChartData 对象,dataSets[IChartDataSet] Swift 数组。

在 Objective-C 中使用 Swift 数组的解决方法是什么?

【问题讨论】:

  • 你是如何设置 yVals 数组的?

标签: ios objective-c arrays swift ios-charts


【解决方案1】:

按照下面的操作。

    NSMutableArray *xVals = [[NSMutableArray alloc] init];
    for (int i=0;i<dataPoints.count;i++)
    {
        [xVals addObject:[dataPoints objectAtIndex:i]];
    }

    NSMutableArray *yVals = [[NSMutableArray alloc] init];        
    for (int i=0;i<values.count;i++)
    {
        int val = [([values objectAtIndex:i])intValue];
        [yVals addObject:[[ChartDataEntry alloc] initWithValue:(int)val xIndex:i]];
    }

    LineChartDataSet *set1 = nil;
    set1 = [[LineChartDataSet alloc] initWithYVals:yVals label:@""];

    NSMutableArray *dataSets = [[NSMutableArray alloc] init];
    [dataSets addObject:set1];
    LineChartData *data = [[LineChartData alloc] initWithXVals:xVals dataSets:dataSets];
    lineChart.data = data;

【讨论】:

    【解决方案2】:

    与其只是给出答案,不如了解正在发生的事情然后继续寻找可能的解决方案。我遇到了同样的问题,对我来说,我没有将我的价值观包装在 ChartDataEntry 类周围。

    例如

    这个为我抛出了错误

    NSArray *data = <some data>
    LineChartDataSet *dataSet = [[LineChartDataSet alloc] initWithValues:data label:@"Predictions"];
    

    对比

    这个很好用!

    NSArray *data = <some data>
    NSMutableArray<ChartDataEntry *> *entries = [NSMutableArray new];
    
    NSInteger index = 0;
    for (NSNumber *value in data) {
        [entries addObject:[[ChartDataEntry alloc] initWithX:index y:[value doubleValue]]];
        index++;
    }
    
    LineChartDataSet *dataSet = [[LineChartDataSet alloc] initWithValues:entries label:@"Predictions"];
    

    【讨论】:

      最近更新 更多