我一直在开发一个支持Xcode 8.2和iOS8的objc项目。
我通过Carthage安装了一个swift库(https://github.com/danielgindi/Charts),但如果我调用此库的任何方法,应用程序崩溃时会出现“无法识别的选择器发送到实例”错误。
我可以通过Cocoapods使它工作,但是当我使用带Cocoapods的Swift库时,构建时间会非常慢,所以我想尽可能使用Carthage。
有没有办法在迦太基的objc项目中使用swift库?
基本上,我根据页面通过Carthage安装了Charts库。 https://github.com/Carthage/Carthage/blob/master/README.md
我只使用嵌入式二进制文件来添加Charts.framework而不是Linked Frameworks,因为它解决了启动时的崩溃问题。
答案 0 :(得分:4)
有没有办法在迦太基的objc项目中使用swift库?
在项目设置中将Charts.framework添加到嵌入式二进制文件后,可以将Swift代码导入ObjC,如下所示。例如,对于名为ChartsObjCSample
的示例项目,您需要:
import "ChartsObjCSample-Swift.h"
现在,您应该可以在ObjC代码中使用Charts API。
但是,有时候没有创建上面的-Swift.h
文件,在这种情况下你可以创建一个虚拟的Swift文件,根据Xcode指令添加brining头,然后再清理,再生建,创建-Swift.h
文件。
最后,要使用Charts API创建BarChart,您可以将ViewController的storyboard视图类指定为BarChartView
,如下所示。
然后视图控制器可以使用如下代码渲染BarChart:
#import "ViewController.h"
#import "ChartsObjCSample-Swift.h"
@import Charts;
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
BarChartView* barChartView = (BarChartView*)self.view;
NSMutableArray* dataEntries = [[NSMutableArray alloc] init];
for(int i = 0; i < 100; i++) {
BarChartDataEntry* dataEntry = [[BarChartDataEntry alloc] initWithX:5.0 * arc4random_uniform(12) y:100.0];
[dataEntries addObject:dataEntry];
}
BarChartDataSet* dataSet = [[BarChartDataSet alloc] initWithValues:dataEntries label:@"Visitor Count"];
BarChartData* barChartData = [[BarChartData alloc] initWithDataSet:dataSet];
barChartView.data = barChartData;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
呈现的条形图的屏幕截图:
以上示例代码可在GitHub here上找到。
来自apple docs: 将Swift代码从同一目标导入Objective-C
使用此语法将该目标中的Swift代码导入该目标中的任何Objective-C .m文件并替换相应的名称:
#import "ProductModuleName-Swift.h"