原因 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 文件
也许你以为这就完事了,Xcode 帮我们做了剩下的事情,其实不是。我们还需要告诉 Xcode:”我们需要在项目里使用 Swift 和 Objective-C”(通过配置项目)。
为了实现这点,点击您的项目 target-> Build Setting 选显卡。 找到 Embedded Content contains Swift Code(在Build Options中) 选项:
开启这个配置是让这个 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()
}
}
准备好 Objective-C 类
最后一步,跟 OC 调用其他文件一样,需要引入一个 Xcode 生成的 Swift 头文件到 OC 类里。有一件事是,Swift 并没有头文件 - 怎么办呢?
其实我们需要引入的这个头文件并不真实的存在 - 不是一个物理文件。是由 Xcode 在幕后生成的虚拟文件。文件名是根据你的项目名字而定,但是我们并不知道文件的名字,如何 Import
呢?
继续找到 target->Build Setting 选项卡。在 Swift Compiler – Code Generation 里找到 Objective-C Generated Interface Header Name:
我创建的项目名为 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地址