Objective-C与Swift之间的相互调用

今天,在Objective-C的工程中集成swift插件时遇到了一点小麻烦。

1、不管是CocoaPods还是CoreData,集成的时候总会提示没有定义SWIFT版本号

那么这种情况下,只要在工程里面创建一个.swift文件,你在工程配置的Build setting选项卡,就可以看到有几个关于Swift的配置。如果按照Xcode提示开启桥接,那么Xcode就会自己帮你创建一个只含注释的头文件,在Build setting中创建好桥接的配置。这样基本上可以解决引入Swift插件的第一个关键问题,就是编译问题和在Swift中调用Objective-C中的方法

自动生成的swift版本号配置:

自动生成的bridge.h的内容:

//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

2、从Objective-C调用Swift接口,参考这篇文章的Migrate Your Code中第四点

注:官方没说Build Settings中的Defines Module,所以不用改为yes

常规做法:

1)、要在swift文件中写@objc(name),不写括号中的name就根据当前的定义自动转换
2)、引入头文件

#import “ProductModuleName-Swift.h”

这个头文件是Xcode自动处理的,只需要关注它的名字ProductModuleName

这里的ProductModuleName指的是模块名,比如工程定义了ProjectName为Demo,没改Build Settings中的Product Module Name的值,那么引入#import “Demo-Swift.h”,编译是不会报错的。如果Product Module Name改成Demo255,那么就要引入#import “Demo255-Swift.h”。不要搞错了,把ProductModuleName认为是ClassName,那编译器只会永远找不到那个头文件。这个头文件是Swift可被Objective-C访问的定义的集合。

搞定以上两步,就可以很好的写代码了。很久没碰Swift了,这次发现Swift 5比之前Swift 3要容易的多了,语法相对要人性化些。例如判空机制、类型强转、智能纠错,这些地方给了我蛮大的惊喜。

发表评论

电子邮件地址不会被公开。 必填项已用*标注