如何通过Carthage在Obj-C项目中使用Swift库

时间:2016-12-26 05:04:34

标签: objective-c swift charts cocoapods carthage

我一直在开发一个支持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,因为它解决了启动时的崩溃问题。

1 个答案:

答案 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,如下所示。

enter image description here

然后视图控制器可以使用如下代码渲染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

呈现的条形图的屏幕截图:

enter image description here

以上示例代码可在GitHub here上找到。

来自apple docs: 将Swift代码从同一目标导入Objective-C

使用此语法将该目标中的Swift代码导入该目标中的任何Objective-C .m文件并替换相应的名称:

#import "ProductModuleName-Swift.h"