前几天自从项目的某个commit开始,Xcode的编译时间至少长了一半,同时代码的高亮和代码补全也无法正常工作,那几天就是像在用记事本在写代码,今天稍微调查了下,找到了原因,原来是有一个commit添加了一个用swift实现的AppDelegate类的扩展方法。然后由于要在AppDelegate中使用这个扩展方法,就在OC和Swift的桥接头文件中加了这么一行

1
#import "AppDelegate.h"

就是这一行,导致原本已经很烂的Xcode彻底报废,想象一下如果你每天面对的是一个代码提示和高亮基本是残废的IDE会是一种什么心情。既然找到原因了,那就研究下为什么会导致Xcode响应变慢。

最后自己重新建了一个OC的项目想重现一下Xcode响应慢的问题,结果Xcode的代码高亮和提示的问题并没有再出现,至于为什么公司项目会让Xcode崩,等有时间了再研究下。

在Swift中使用OC

首先先介绍了为什么Swift和OC代码可以在一个项目里共存,这里会介绍两个文件,第一个是ProjectName-Bridging-Header.h,当你往你的OC项目中添加Swift代码时,Xcode会提示可以为你自动创建该文件,或者通过新建一个头文件来手动创建。有了这个文件,你就可以在Swift代码中使用OC的代码了。你只需要在这个头文件中添加你需要使用的OC类的头文件即可,比如在其中添加下面几个头文件

1
2
3
#import "XYZCustomCell.h"
#import "XYZCustomView.h"
#import "XYZCustomViewController.h"

添加完后,别忘了在BuildingSetting中将Swift Compiler - Code Generation的路径设为刚刚创建的ProjectName-Bridging-Header.h然后你就能在Swift中使用OC代码了。

1
2
let myCell = XYZCustomCell()
myCell.subtitle = "A custom cell"

在OC中使用Swift

在OC中调用Swift的代码其实比上面要更简单些,因为系统会自动帮你生成一个ProjectName-Swift.h,通常情况下,这个文件会为你添加Swift中的变量以及函数,具体什么情况下的变量和方法会被添加到该文件中可以查阅一下官方文档,这里不细说。如果你要在OC的类中使用Swift代码的话,请务必在.m文件中添加

1
#import "ProjectName-Swift.h"

简单讲了下OC和Swift如何混编,现在具体分析下为什么Xcode因为一个小小的Extensition就不行了呢,首先我们扩展的是OC项目中的AppDelegate类,用swift实现一个AppDelegate类的someFunction,然后经过编译,在ProjectName-Swift.h中就会自动生成下面的代码,然后我们才能在AppDelegate类中使用我们用swift实现的扩展方法

1
2
3
@interface AppDelegate (SWIFT_EXTENSION(mixch))
- (BOOL)someFunction:(NSString * _Nonnull)category kind:(NSString * _Nonnull)kind title:(NSString * _Nonnull)title SWIFT_WARN_UNUSED_RESULT;
@end

最后附上相关资料:
Using Swift with Cocoa and Objective-C (Swift 4)
深入理解 Swift 派发机制