我想使用ANDLineChartView,一个用Objective C编写的API,在我的Swift应用程序中,在ios中创建图表作为视图。到目前为止,我所尝试的只是将Objective-C源代码添加到我的swift项目中,并在其中添加一行代码的桥接头(obj-C):

#import "AndLineChartView.h"

这允许我在我的swift代码中创建类型和LineChartView的对象。问题是ANDLineChartView需要一个符合ANDLineChartView dataSource协议的数据源,所以我(在Swift中)编写了一个符合这个协议的@objc类(并且我扩展了NSObject,所以它也符合NSObject protocol,这也是必要的)。我用Swift实现了ANDLineChartViewDataSource所需的所有必要方法,最后添加了:
#import "MyProjectName-Swift.h"

当然,my project name是ANDLineChartView.m.的项目名。根据我在互联网上了解到的情况,这是在Swift项目中使用目标C代码的标准方法,反之亦然。因此,我继续创建ANDLineChartView的实例,并将其dataSource属性设置为实现ANDLineChartViewDataSource的类的实例。
***断言失败-[ANDLineChartView numberOfElements],/path/ANDLineChartView.m:158
未设置数据源。
由ANDLineChartView.m中的这些代码行生成:
- (NSUInteger)numberOfElements{
  if(_dataSource && [_dataSource respondsToSelector:@selector(numberOfElementsInChartView:)]){
    return [_dataSource numberOfElementsInChartView:self];
  }else{
    NSAssert(_dataSource, @"Data source is not set.");
    NSAssert([_dataSource respondsToSelector:@selector(numberOfElementsInChartView:)], @"numberOfElementsInChartView: not implemented.");
    return 0;
  }
}

我的第一个想法是,我的函数作为目标C选择器是不可见的,所以我更改了NSObjects响应(对Selector:Selector!)->布尔方法:
  public override func responds(to aSelector: Selector!) -> Bool {
    if aSelector == #selector(numberOfElements(in:)) ||
       aSelector == #selector(numberOfGridIntervals(in:)) ||
       aSelector == #selector(chartView(_:valueForElementAtRow:)) ||
       aSelector == #selector(chartView(_:descriptionForGridIntervalValue:)) ||
       aSelector == #selector(maxValueForGridInterval(in:)) ||
       aSelector == #selector(minValueForGridInterval(in:)) {
         return true
     } else {
         return super.responds(to: aSelector)
    }
  }

下面是我对图表和数据源的声明:
third = ANDLineChartView(frame : CGRect(x : 0,
                                        y : 0,
                                        width : UIScreen.main.bounds.width,
                                        height : Main.screenSegment * 9.5))

third.dataSource = GoalData(data: UserData.past)

其中GoalData是我的ANDChartViewDataSource类,它是用一个数组UserData.past初始化的。
不过,我还是收到了同样的错误消息,在这一点上,特别是因为我以前甚至没有在项目中使用桥接头等,所以我来这里寻求帮助。我也不知道Objective C,所以一个不必在Objective C中重写我的数据源类的解决方案将是非常棒的。或者,如果您对用Swift编写的图表api有任何建议,那也会很有帮助,因为这样我就不用担心这个问题了。但我也很好奇,所以。。。
非常感谢你的帮助。
Similar Question
NSObjectProtocol Documentation

最佳答案

问题是我刚刚将数据源分配给GoalData,但dataSource是一个弱属性,因此除非有其他东西使GoalData实例保持活动状态,否则它将变为零并导致应用程序失败,因为dataSource没有值。
我将此添加到实现了ANDLineChartView实例的类中:

var dataSource : GoalData?

然后我在初始值设定项中添加:
self.dataSource = GoalData(data : UserData.past)
third = ANDLineChartView(frame : CGRect(x : 0,
                                    y : 0,
                                    width : UIScreen.main.bounds.width,
                                    height : Main.screenSegment * 9.5))

third.dataSource = self.dataSource

10-07 22:57