IOS – Importing Swift into Objective-C

一般常見的都是Importing Objective-C into Swift (ex: Swift base project使用 Objective-C library),但這次的專案需求,需要Importing Swift into Objective-C(i.e 在Objective-C下使用Swift library)

官方有文件說明,但是少了一些關鍵的部分(Note 1),以下描述整個流程:

Importing Swift into Objective-C 流程:

Import Swift into Objective-C架構圖 (from 官方文件)

處理流程就是用Xcode開啟Objective-C project,並新增或拖移一個Swift檔,系統就會自動幫我們產生ProductModuleName-Swift.h。然後我們就想要使用Swift Code的Objective-C的.m或.h檔去import ProductModuleName-Swift.h,我們就可以在Objective-C檔中去使用Swift的code。

注意在.m檔中和.h檔中去import ProductModuleName-Swift.h的寫法要不一樣。

  • 在.m檔中用 #import <ProductModuleName-Swift.h>
  • 在.h檔中用 @class MySwiftClass;

.h檔中不用#import是因為要避免cyclical reference,因為我們的Swift檔和Objective-C都是在同一個build target中,如果用import,就會導致cyclical reference。

Note:

  1. ProductModuleName-Swift.h這個檔案在我們的Objective-C project不會看到,且官方文件未提到如何找到這個ProductModuleName-Swift.h。要看到這個檔案,只要我們先在Objective-C project中任一個檔案撰寫 #import <ProductModuleName-Swift.h>,然後我們按下command並用滑鼠點擊ProductModuleName-Swift.h (p.s 同我們查看API definition的方法),這樣我們就可以看到ProductModuleName-Swift.h內容
  2. 我們可以透過這個ProductModuleName-Swift.h來檢查我們的Swift code是否有成功expose to Objective-C檔。 (範例project名稱是TestObjc,即為ProductModuleName)
    1. 如果有成功的話,會在ProductModuleName-Swift.h看到如下的程式碼:undefined
    2. 否則會看到如下的程式碼: undefined
  3. ProductModuleName-Swift.h內容無法修改,所以務必依照Apple官方文件(Ref (1))的規則去撰寫Swift code
  4. ProductModuleName-Swift.h這個自動產生的檔案,在Build setting中,有欄位去參考這個檔案的位置:undefined
  5. 其他補充: ProductModuleName-Swift.h是Importing Swift to Objective-C需要用的
  6. 其他補充: ProductModuleName-Bridging-Header.h是Importing Objective-C to Swift需要用的

附上Sample Project,其內容是把一個DataModel.Swift檔import到一個Objective-C project中,對這個DataModel進行初始化,並把data的值印出來:

link: https://github.com/tgnivekucn/SwiftToObjC

Ref:

(1)官方文件: https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c