OC、Swift混编
在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
-
由于
Objective-C Generated interface Header Name.pngXcode
会根据的Target
的创建Swift
转换OC
下生的成接口头文件’,英文:Objective-C Generated interface Header Name
-
新建一个
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"
,类似的其他库的引用方式都需要修改;