OC、Swift混編

在OC項(xiàng)目中,有可能會(huì)遇到需要引入Swift寫的第三方庫。在Swift項(xiàng)目中,也有可能會(huì)遇到需要引入OC寫的第三方庫,下面整理了具體過程。

混編說明

引入方式 說明
Swift訪問OC Swift中引入OC的類、Frameworks、CocoaPods引入三方庫等,都不需要每次需要使用時(shí)import,只需要統(tǒng)一在橋接文件ProductName-Bridging-Header.h中導(dǎo)入需要暴露給Swift使用的,即可在Swift中使用OC
OC訪問Swift OC中引入Swift,需要做一些配置,然后在在OC中需要的地方導(dǎo)入ProductName-Swift.h文件,即可在OC中訪問Swift中暴露給OC的屬性和方法。

ProductName是當(dāng)前工程名

Swift引入OC

  1. 新建一個(gè)Swift工程SwiftAddOC,新建一個(gè)OC的類,Xcode會(huì)提醒你是否創(chuàng)建一個(gè)橋接文件,選擇Create Bridging Header,Xcode會(huì)自動(dòng)幫我們給Target建立對(duì)應(yīng)的橋接文件,選擇Don't Create,則需要我們自己創(chuàng)建橋接文件,然后在Xcode的配置中配置橋接文件路徑。

    橋接文件是用于在Swift中訪問OC的類,名稱為ProductName-Bridging-Header.h

選擇是否建立橋接文件
自創(chuàng)橋接文件配置路徑
  1. 無論是自己創(chuàng)建的OC類或者CocoaPods導(dǎo)入的,只需要在橋接文件中導(dǎo)入Swift需要訪問的OC類和三方的頭文件,這樣所以Swift文件都能訪問相應(yīng)的OC類了
橋接文件導(dǎo)入OC
Swift調(diào)用OC

OC引入Swift

  1. 新建一個(gè)OC工程OCAddSwift,新建一個(gè)Swift的類,Xcode會(huì)提醒你是否創(chuàng)建一個(gè)橋接文件,選擇Create Bridging Header,Xcode會(huì)自動(dòng)幫我們給Target建立對(duì)應(yīng)的橋接文件,橋接文件對(duì)于OC引入Swift沒有什么作用。

    選擇是否建立橋接文件

  2. TargetsBuild Settings設(shè)置Defines ModulesYES

設(shè)置Defines Modules
  1. 由于Xcode會(huì)根據(jù)的Target的創(chuàng)建Swift轉(zhuǎn)換OC下生的成接口頭文件’,英文:Objective-C Generated interface Header Name

    Objective-C Generated interface Header Name.png

  2. 新建一個(gè)SwiftTestSwift文件,寫一個(gè)Swift的函數(shù)

    注意:Swift的類需要能夠被OC調(diào)用,那么它暴露給OC的方法和屬性前面必須添加@objc,如下圖

測(cè)試OC調(diào)用Swift
  1. OC中調(diào)用Swift方法,必須在文件中導(dǎo)入ProductName-Swift.h,這個(gè)是不會(huì)聯(lián)想的,必須手動(dòng)輸入,如下圖
    OC調(diào)用Swift方法

注意:中途我們可能需要改項(xiàng)目的名稱,那樣可能會(huì)導(dǎo)致報(bào)錯(cuò),如下

'ProductName-Swift.h' file not found

這時(shí)候我們需要在info.plist加入Bundle display name,然后寫入相應(yīng)需要更改名稱即可。

OC引入Swift的framework

  1. 同上設(shè)置一遍,然后將相應(yīng)的framework導(dǎo)入到工程中
導(dǎo)入framework
  1. Project->General->Embedded Binaries下添加進(jìn)去相應(yīng)的framework,Linked Frameworks and Libraries中刪除多余的
導(dǎo)入Embedded Binaries
  1. 導(dǎo)入#import <AWSDK/AWSDK-Swift.h>而不是#import <AWSDK/AWSDK.h>``#import <AWSDK/AWSDK-Swift.h>OC項(xiàng)目導(dǎo)入Swift Framework時(shí)自動(dòng)產(chǎn)生的文件,給我們展示可以用哪些接口,這時(shí)候技能調(diào)用Swift Framework中的方法了
調(diào)用framework

OC項(xiàng)目中使用Swift版的pod

Podfile文件中添加 use_frameworks!

- 用cocoapods 導(dǎo)入swift庫時(shí) 到 swift項(xiàng)目和OC項(xiàng)目都必須要 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項(xiàng)目中使用了use_frameworks!#import "AFNetworking.h" 需要改成#import "AFNetworking/AFNetworking.h",類似的其他庫的引用方式都需要修改;

注意

  1. Swift引入OC必須建立橋接文件,橋接文件是用于在Swift中訪問OC的類,名稱格式為ProductName-Bridging-Header.h
  2. OC引入Swift必須在文件中導(dǎo)入ProductName-Swift.h,另外Swift暴露給OC的方法和屬性前面必須添加@objc
  3. OC引入SwiftframeworkEmbedded Binaries下添加進(jìn)去相應(yīng)的framework,例如導(dǎo)入#import <AWSDK/AWSDK-Swift.h>
  4. OC項(xiàng)目中使用了use_frameworks!#import "AFNetworking.h" 需要改成#import "AFNetworking/AFNetworking.h",類似的其他庫的引用方式都需要修改;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容