如何通过 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"
我一直在用 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"