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

Non*_*oto 1 charts objective-c cocoapods swift carthage

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

我通过 Carthage 安装了一个 swift 库(https://github.com/danielgindi/Charts),但是如果我调用该库的任何方法,应用程序就会崩溃,并出现“无法识别的选择器发送到实例”错误。

我可以通过 Cocoapods 使其工作,但是当我将 Swift 库与 Cocoapods 一起使用时,构建时间会非常慢,所以如果可能的话我想使用 Carthage。

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

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

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

3d-*_*nes 5

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

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

import "ChartsObjCSample-Swift.h"
Run Code Online (Sandbox Code Playgroud)

现在您应该能够在 ObjC 代码中使用 Charts API。

但是,有时-Swift.h不会创建上述文件,在这种情况下,您可以创建一个虚拟 Swift 文件,按照 Xcode 说明添加盐标头,然后清理,再次构建,这应该会创建该-Swift.h文件。

最后,要使用 Charts API 创建 BarChart,您可以有一个 ViewController,其分配的 Storyboard 视图类如下BarChartView所示。

在此输入图像描述

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

#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
Run Code Online (Sandbox Code Playgroud)

渲染的条形图的屏幕截图:

在此输入图像描述


上述示例代码可在GitHub 上找到。


来自苹果文档:将 Swift 代码从同一目标导入 Objective-C

使用以下语法并替换适当的名称,将 Swift 代码从该目标导入到该目标内的任何 Objective-C .m 文件中:

#import "ProductModuleName-Swift.h"
Run Code Online (Sandbox Code Playgroud)