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

How to use Swift library in Obj-C project via Carthage

我一直在用 Xcode 8.2 和 iOS8~ 支持开发一个 objc 项目。

我通过 Carthage 安装了一个 swift 库 (https://github.com/danielgindi/Charts),但是如果我调用这个库的任何方法,应用程序会崩溃并出现 "unrecognized selector sent to instance" 错误。

我可以通过 Cocoapods 使它工作,但是当我将 Swift 库与 Cocoapods 一起使用时构建时间会很慢,所以我想尽可能使用 Carthage。

有没有办法通过 Carthage 在 objc 项目中使用 swift 库?

基本上,我是根据页面通过Carthage安装Charts库的。 https://github.com/Carthage/Carthage/blob/master/README.md

我只使用嵌入式二进制文件来添加 Charts.framework 而不是链接框架,因为它解决了启动时的崩溃问题。

Is there any way to use swift library in objc project via Carthage?

在项目设置中将 Charts.framework 添加到嵌入式二进制文件后,您可以将 Swift 代码导入 ObjC,如下所示。例如,对于名为 ChartsObjCSample 的示例项目,您需要:

import "ChartsObjCSample-Swift.h"

现在您应该可以在您的 ObjC 代码中使用图表 API。

但是,有时上面的 -Swift.h 文件不会被创建,在这种情况下你可以创建一个虚拟的 Swift 文件,按照 [=51 添加 brining header =] 说明,然后清理,再次构建,这应该会创建 -Swift.h 文件。

最后,要使用图表 API 创建条形图,您可以将故事板视图 class 分配为 BarChartView 的 ViewController,如图所示下面。

然后视图控制器可以使用如下代码呈现条形图:

#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"