Objective-C Mix Swift Configuration:混編設定

weixin_34075551發表於2016-04-14

隨著 Swfit的不斷成熟,在實際工作中可能會需要將 OC 與 Swift 進行混編,在混編的過程中可能出現很多設定上的錯誤導致混編的程式碼不能夠很好的編譯。

在混編環境的配置上的錯誤只要檢查關鍵的幾個步驟,基本上可以解決大部分問題。

  • 需要混編的Swift類最好使用 @objc 明確標記,所宣告的類儘量繼承自 NSObject 及其子類;
import UIKit

@objc class Hello: NSObject {
    func sayHello() {
        print("Hi there!")
    }
}
  • 在Build Settings中檢查以下幾項設定
  1. Product Module Name: 該項預設為專案名或自定義的名稱
  2. Defines Module: 設定為YES
  3. Embedded Content Contains Swift: 設定為YES
  4. Install Objective-C Compatibility Header:設定為YES
  5. 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 //該標頭檔案名由開發者自定義或系統自動生成,此處僅作示例

混編注意事項

  1. 對專案進行Clean操作時,Xcode會刪除自動生成的yourProjectName-Swift.h標頭檔案,然後進行Build操作,Xcode 在編譯完專案中所有的Swift程式碼後會再次生成相關的標頭檔案。
  2. Xcode自動生成的yourProject-Swift.h標頭檔案,在引用時可能不會有智慧提示,只要按照格式輸入即可,該檔案實際上也可以在Build Setting中的Objective-C Generated Interface Header Name 選項進行設定,預設不需要修改
  3. OC -> Swift 是將OC的標頭檔案放到自己設定的或系統生成的橋接標頭檔案中,然後在Swift中進行呼叫
  4. Swift -> OC 是Xcode編譯器自動生成的橋接標頭檔案,一般為 專案名-Swift.h , 進入該標頭檔案可以看到由編譯器自動生成的可在OC中使用的屬性和方法,因為 Swift 增加了很多新的特性是OC並不支援的,因此在該檔案中或實際呼叫時可能出現沒有該方法可呼叫的錯誤,因此要特別注意,相關OC不支援的特性可查閱Apple文件(參考1)
  5. 還有一些其它的問題,(參考2)

我遇到的小坑

之前我是參考4中OC使用的設定,進行混編的當時沒有出現問題,有一次我新建的Swift類不能自動生成到XX-Swift.h標頭檔案中,當時很納悶,因為我不需要在Swfit中使用OC類,所以就沒有新增設定OC到Swfit的標頭檔案,感覺不會是這個原因,在嘗試了上述的配置方法後,最終我自己新建了一個橋接標頭檔案,然後在Build Setting中設定好該標頭檔案,實際上這個標頭檔案中什麼都沒有,但是,這樣設定後確實解決了不能生成正確XX-Swift.h的問題。

相關參考

  1. Apple官方文件
  2. Swift專案相容Objective-C問題彙總
  3. Can't use Swift classes inside Objective-C:StackOverFlow
  4. 簡單設定請參考這裡:在Swift專案中使用OC,在OC專案中使用Swift

相關文章