如何在 Objective-C 项目中使用 Swift 类

原因 http://jrjian.github.io/2016/03/10/embed-swift-to-oc/

准备好 Xcode OC 项目

当我们往 OC 项目添加 Swift 文件的时候,如果是第一次将会看见一个 Xcode 的招待框:”Would you like to configure an Objective-C bridging header?”。根据我们的主题(OC 嵌 Swift),这显然应该不需要桥接:但是创建后有利于我们 Swift 调用 OC,也许未来我们需要用到,所以我们选择 Create。文件的目录结构将会多出 项目名-Bridging-Header.h 文件

图1

也许你以为这就完事了,Xcode 帮我们做了剩下的事情,其实不是。我们还需要告诉 Xcode:”我们需要在项目里使用 Swift 和 Objective-C”(通过配置项目)。

为了实现这点,点击您的项目 target-> Build Setting 选显卡。 找到 Embedded Content contains Swift Code(在Build Options中) 选项:

图2

开启这个配置是让这个 target 项目包含 Swift 的代码,因此 Swift 的标准库将能够在该项目使用,官方文档说明

准备好 Swift 类

这里我们创建了一个继承自 UIViewcController 的 SwiftViewController 类。代码如下:

class SwiftViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.purpleColor()
    }
}

为了让 OC 能够调用该类,需要在类的定义前加入一个关键字 @objc。这是告诉编译器在幕后进行一些额外操作(命名,创建一个不可见的头文件等),让 Swift 的代码暴露给 OC:

@objc class SwiftViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.purpleColor()
    }
}

@objc 官方文档说明

准备好 Objective-C 类

最后一步,跟 OC 调用其他文件一样,需要引入一个 Xcode 生成的 Swift 头文件到 OC 类里。有一件事是,Swift 并没有头文件 - 怎么办呢?

其实我们需要引入的这个头文件并不真实的存在 - 不是一个物理文件。是由 Xcode 在幕后生成的虚拟文件。文件名是根据你的项目名字而定,但是我们并不知道文件的名字,如何 Import 呢?

继续找到 target->Build Setting 选项卡。在 Swift Compiler – Code Generation 里找到 Objective-C Generated Interface Header Name

图3

我创建的项目名为 SwiftInOCDemo,因此 Xcode 生成的文件名 “SwiftInOCDemo-Swift.h”。这就是 OC 中需要引入的头文件。

注意不需要引入 Xcode 生成的桥接文件 SwiftInOCDemo-Bridging-Header.h,这个文件是用来暴露 OC 的库给 Swift 的。因此我们只需要引入 SwiftInOCDemo-Swift.h 即可:

#import "ViewController.h"
#import "SwiftInOCDemo-Swift.h"

@interface ViewController ()

@end

注意:也许你想问是否有多个这种 XXX-Swift.h 头文件,答案是否,所有通过 @objc 关键字暴露的 Swift 代码都会被放置这个 SwiftInOCDemo-Swift.h 文件中。因此只有一个头文件。

在 Objective-C 代码中调用 Swift 方法

经过上面的所有步骤,终于可以在 OC 中调用 Swift 方法了:

- (void)viewDidLoad {
    [super viewDidLoad];
    SwiftViewController *controller = [[SwiftViewController alloc] init];
    NSString *title = [controller myTitle];
    NSLog(@"%@", title);

    // 输出: SwiftViewController
}

Tip: 如果你发现敲完代码后,编译器报错。不需要担心,点击 CMD + B 编译项目:这会强制让编译器查看所有引用的类。每次你修改完 Swift 代码后都应该干这件事。你也可以按住 CMD 点击 SwiftViewController 查看源文件代码。

总结

这篇文章的概念适用于所有 Objective-C 调用 Swift 类,包括属性,方法和协议等。demo地址

更多阅读

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值