Objective-C Mix Swift Configuration:混編設定
隨著 Swfit的不斷成熟,在實際工作中可能會需要將 OC 與 Swift 進行混編,在混編的過程中可能出現很多設定上的錯誤導致混編的程式碼不能夠很好的編譯。
在混編環境的配置上的錯誤只要檢查關鍵的幾個步驟,基本上可以解決大部分問題。
- 需要混編的Swift類最好使用
@objc
明確標記,所宣告的類儘量繼承自NSObject
及其子類;
import UIKit
@objc class Hello: NSObject {
func sayHello() {
print("Hi there!")
}
}
- 在Build Settings中檢查以下幾項設定
- Product Module Name: 該項預設為專案名或自定義的名稱
- Defines Module: 設定為YES
- Embedded Content Contains Swift: 設定為YES
- Install Objective-C Compatibility Header:設定為YES
- Objective-C Bridging Header: 自定義需要橋接到Swift中的OC標頭檔案(EX:$(SRCROOT)/Swift-Bridging-Header.h)
- 在使用Swift類的 OC .m 檔案中引用由XCode自動生成的標頭檔案
#import "yourProject-Swift.h"
- 在使用OC類的Swift檔案中,加入橋接頭
import Swift-Bridging-Header.h //該標頭檔案名由開發者自定義或系統自動生成,此處僅作示例
混編注意事項
- 對專案進行Clean操作時,Xcode會刪除自動生成的yourProjectName-Swift.h標頭檔案,然後進行Build操作,Xcode 在編譯完專案中所有的Swift程式碼後會再次生成相關的標頭檔案。
- Xcode自動生成的yourProject-Swift.h標頭檔案,在引用時可能不會有智慧提示,只要按照格式輸入即可,該檔案實際上也可以在Build Setting中的Objective-C Generated Interface Header Name 選項進行設定,預設不需要修改
- OC -> Swift 是將OC的標頭檔案放到自己設定的或系統生成的橋接標頭檔案中,然後在Swift中進行呼叫
- Swift -> OC 是Xcode編譯器自動生成的橋接標頭檔案,一般為
專案名-Swift.h
, 進入該標頭檔案可以看到由編譯器自動生成的可在OC中使用的屬性和方法,因為 Swift 增加了很多新的特性是OC並不支援的,因此在該檔案中或實際呼叫時可能出現沒有該方法可呼叫的錯誤,因此要特別注意,相關OC不支援的特性可查閱Apple文件(參考1) - 還有一些其它的問題,(參考2)
我遇到的小坑
之前我是參考4中OC使用的設定,進行混編的當時沒有出現問題,有一次我新建的Swift類不能自動生成到XX-Swift.h標頭檔案中,當時很納悶,因為我不需要在Swfit中使用OC類,所以就沒有新增設定OC到Swfit的標頭檔案,感覺不會是這個原因,在嘗試了上述的配置方法後,最終我自己新建了一個橋接標頭檔案,然後在Build Setting中設定好該標頭檔案,實際上這個標頭檔案中什麼都沒有,但是,這樣設定後確實解決了不能生成正確XX-Swift.h的問題。
相關參考
相關文章
- Objective-C和Swift混編ObjectSwift
- OC和Swift混編Swift
- OC和Swift混編經驗Swift
- iOS UMeng OC和Swift混編iOSSwift
- 進階-Swift和OC混編生成 swift pod私有庫Swift
- OC與Swift混編專案遷移到Swift4.2小記Swift
- 雲音樂 Swift 混編 Module 化實踐Swift
- 京東App Swift 混編及元件化落地APPSwift元件化
- iOS-OC、Swift混編之橋接檔案iOSSwift橋接
- XCode 中 Swift / Objective-C / C / C++ 混合程式設計XCodeSwiftObjectC++程式設計
- 小米mix3電話鈴聲設定教程 小米mix3怎麼設定電話鈴聲?
- swift 獲取通知設定Swift
- 小米MIX3 AI鍵喚醒小愛同學設定教程 小米MIX3 AI鍵怎麼設定?AI
- 如何在 openSUSE 中使用 Zypper Configuration 設定代理
- 使用Laravel Mix(Webpack)設定Bootstrap 5工作流程LaravelWebboot
- swift 混編 oc 斷點時資料只有變數名稱不顯示值Swift斷點變數
- python與matlab混編PythonMatlab
- Swift 呼叫 Objective-C 的可變引數函式SwiftObject函式
- laravel-mix編譯失敗Laravel編譯
- UIButton設定image上下左右位置 swiftUISwift
- 一個在 Objective-C 和 Swift 中實現剖面導向程式設計的故事ObjectSwift程式設計
- spring boot kotlin java 混編Spring BootKotlinJava
- 今天在object-c 和swift 混編的時候出現錯誤:could not build module foundationObjectSwiftUI
- Laravel Mix 編譯 Vue 踩坑記錄Laravel編譯Vue
- QML::qml與c++混編C++
- Sublime 編寫編譯 swift程式碼編譯Swift
- MyEclipse設定文字編碼Eclipse
- Swift iOS : 定製CellSwiftiOS
- SpringBoot-定義自己的auto-configurationSpring Boot
- [混編] iOS原生專案- 接入FlutteriOSFlutter
- 來一次有側重點的區分Swift與Objective-CSwiftObject
- 一份非常詳盡的 Objective-C 到 Swift 的遷移指南ObjectSwift
- wordpress 設定編輯器預設模式模式
- Ubuntu 下設定中文編碼Ubuntu
- MySQL字元編碼設定方法MySql字元
- iOS 編寫高質量Objective-C程式碼iOSObjectC程式
- 【iOS開發黑科技】與tableViewDelegate,tableViewDataSource說再見,Objective-C,Swift雙版本...iOSViewObjectSwift
- iOS Native混編Flutter互動實踐iOSFlutter
- 編譯開源 Swift Foundation 庫編譯Swift