Я хочу использовать ANDLineChartView , API, написанный на Objective C для создания диаграмм в виде представлений в ios, в моем приложении Swift.До сих пор я пробовал просто добавить исходный код Objective C в мой проект swift и добавить заголовок моста с одной строкой кода (obj-c):
#import "AndLineChartView.h"
Это позволяет мнесделать объекты типа ANDLineChartView в моем быстром коде.Проблема в том, что ANDLineChartView нужен источник данных, соответствующий протоколу ANDLineChartViewDataSource, поэтому я запрограммировал (в Swift) класс @objc, который соответствует этому протоколу (и я расширил NSObject, поэтому он также соответствует NSObjectProtocol, который также необходим),Я реализовал в Swift все необходимые методы, необходимые для ANDLineChartViewDataSource, и наконец добавил:
#import "MyProjectName-Swift.h"
Где MyProjectName - это, конечно же, имя моего проекта для ANDLineChartView.m.Из того, что я узнал через Интернет, это стандартный способ использования кода Objective C в проектах Swift и наоборот.Поэтому я продолжил создание экземпляра 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;
}
}
Сначала я подумал, что мои функции не были видны как селекторы Objective C, поэтому яизмененный NSObjects отвечает (aSelector: Selector!) -> Bool метод:
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 - это мой ANDChartViewDataSourceclass, который инициализируется массивом UserData.past.
Я продолжал получать то же сообщение об ошибке, хотя и в этот момент, особенно потому, что я даже не использовал мостовые заголовки и т. д. в своих проектах ранееЯ пришел сюда за помощью.Я также не знаю Objective C, поэтому решение, которое не связано с переписыванием моего класса dataSource в Objective C, было бы потрясающим.В качестве альтернативы, если у вас есть какие-либо предложения для API диаграмм, написанные на Swift, это тоже будет полезно, потому что тогда мне не придется об этом беспокоиться.Но мне также очень любопытно, так что ...
Спасибо большое за любую помощь.
Аналогичный вопрос
Документация NSObjectProtocol