在OC项目中,有可能会遇到需要引入Swift写的第三方库。在Swift项目中,也有可能会遇到需要引入OC写的第三方库,下面整理了具体过程。
混编说明
| 引入方式 | 说明 |
|---|---|
Swift访问OC
|
Swift中引入OC的类、Frameworks、CocoaPods引入三方库等,都不需要每次需要使用时import,只需要统一在桥接文件ProductName-Bridging-Header.h中导入需要暴露给Swift使用的,即可在Swift中使用OC了 |
OC访问Swift
|
OC中引入Swift,需要做一些配置,然后在在OC中需要的地方导入ProductName-Swift.h文件,即可在OC中访问Swift中暴露给OC的属性和方法。 |
注:ProductName是当前工程名
Swift引入OC
-
新建一个
Swift工程SwiftAddOC,新建一个OC的类,Xcode会提醒你是否创建一个桥接文件,选择Create Bridging Header,Xcode会自动帮我们给Target建立对应的桥接文件,选择Don't Create,则需要我们自己创建桥接文件,然后在Xcode的配置中配置桥接文件路径。注:
桥接文件是用于在Swift中访问OC的类,名称为ProductName-Bridging-Header.h


- 无论是自己创建的
OC类或者CocoaPods导入的,只需要在桥接文件中导入Swift需要访问的OC类和三方的头文件,这样所以Swift文件都能访问相应的OC类了


OC引入Swift
-
新建一个
OC工程OCAddSwift,新建一个Swift的类,Xcode会提醒你是否创建一个桥接文件,选择Create Bridging Header,Xcode会自动帮我们给Target建立对应的桥接文件,桥接文件对于OC引入Swift没有什么作用。
选择是否建立桥接文件 在
Targets下Build Settings设置Defines Modules为YES

-
由于
Xcode会根据的Target的创建Swift转换OC下生的成接口头文件’,英文:Objective-C Generated interface Header Name
Objective-C Generated interface Header Name.png -
新建一个
SwiftTest的Swift文件,写一个Swift的函数注意:
Swift的类需要能够被OC调用,那么它暴露给OC的方法和属性前面必须添加@objc,如下图

-
OC中调用Swift方法,必须在文件中导入ProductName-Swift.h,这个是不会联想的,必须手动输入,如下图
OC调用Swift方法
注意:中途我们可能需要改项目的名称,那样可能会导致报错,如下
'ProductName-Swift.h' file not found
这时候我们需要在info.plist加入Bundle display name,然后写入相应需要更改名称即可。
OC引入Swift的framework
- 同上设置一遍,然后将相应的framework导入到工程中

- 在
Project->General->Embedded Binaries下添加进去相应的framework,Linked Frameworks and Libraries中删除多余的

- 导入
#import <AWSDK/AWSDK-Swift.h>而不是#import <AWSDK/AWSDK.h>``#import <AWSDK/AWSDK-Swift.h>是OC项目导入Swift Framework时自动产生的文件,给我们展示可以用哪些接口,这时候技能调用Swift Framework中的方法了

OC项目中使用Swift版的pod
在Podfile文件中添加 use_frameworks!
- 用cocoapods 导入swift库时 到 swift项目和OC项目都必须要 use_frameworks!
- 使用 dynamic frameworks,必须要在Podfile文件中添加 use_frameworks!
//Podfile文件
platform :ios, '9.0'
source 'https://github.com/CocoaPods/Specs.git'
target 'xxx' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
use_frameworks!
end
注意⚠️:OC项目中使用了use_frameworks!后#import "AFNetworking.h" 需要改成#import "AFNetworking/AFNetworking.h",类似的其他库的引用方式都需要修改;
注意
-
Swift引入OC:必须建立桥接文件,桥接文件是用于在Swift中访问OC的类,名称格式为ProductName-Bridging-Header.h -
OC引入Swift:必须在文件中导入ProductName-Swift.h,另外Swift暴露给OC的方法和属性前面必须添加@objc -
OC引入Swift的framework:Embedded Binaries下添加进去相应的framework,例如导入#import <AWSDK/AWSDK-Swift.h> -
OC项目中使用了use_frameworks!后#import "AFNetworking.h"需要改成#import "AFNetworking/AFNetworking.h",类似的其他库的引用方式都需要修改;


