隨著 Swfit的不斷成熟,在實際工作中可能會需要將 OC 與 Swift 進行混編赏表,在混編的過程中可能出現(xiàn)很多設置上的錯誤導致混編的代碼不能夠很好的編譯喊废。
在混編環(huán)境的配置上的錯誤只要檢查關鍵的幾個步驟,基本上可以解決大部分問題涣达。
- 需要混編的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 //該頭文件名由開發(fā)者自定義或系統(tǒng)自動生成开缎,此處僅作示例
混編注意事項
- 對項目進行Clean操作時棕叫,Xcode會刪除自動生成的yourProjectName-Swift.h頭文件,然后進行Build操作奕删,Xcode 在編譯完項目中所有的Swift代碼后會再次生成相關的頭文件俺泣。
- Xcode自動生成的yourProject-Swift.h頭文件,在引用時可能不會有智能提示完残,只要按照格式輸入即可伏钠,該文件實際上也可以在Build Setting中的Objective-C Generated Interface Header Name 選項進行設置,默認不需要修改
- OC -> Swift 是將OC的頭文件放到自己設置的或系統(tǒng)生成的橋接頭文件中谨设,然后在Swift中進行調用
- Swift -> OC 是Xcode編譯器自動生成的橋接頭文件熟掂,一般為
項目名-Swift.h
, 進入該頭文件可以看到由編譯器自動生成的可在OC中使用的屬性和方法,因為 Swift 增加了很多新的特性是OC并不支持的扎拣,因此在該文件中或實際調用時可能出現(xiàn)沒有該方法可調用的錯誤赴肚,因此要特別注意,相關OC不支持的特性可查閱Apple文檔(參考1) - 還有一些其它的問題,(參考2)
我遇到的小坑
之前我是參考4中OC使用的設置二蓝,進行混編的當時沒有出現(xiàn)問題誉券,有一次我新建的Swift類不能自動生成到XX-Swift.h頭文件中,當時很納悶刊愚,因為我不需要在Swfit中使用OC類踊跟,所以就沒有添加設置OC到Swfit的頭文件,感覺不會是這個原因鸥诽,在嘗試了上述的配置方法后商玫,最終我自己新建了一個橋接頭文件,然后在Build Setting中設置好該頭文件牡借,實際上這個頭文件中什么都沒有决帖,但是,這樣設置后確實解決了不能生成正確XX-Swift.h的問題蓖捶。