一般常見的都是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 流程:
處理流程就是用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:
- 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內容
- 我們可以透過這個ProductModuleName-Swift.h來檢查我們的Swift code是否有成功expose to Objective-C檔。 (範例project名稱是TestObjc,即為ProductModuleName)
- 如果有成功的話,會在ProductModuleName-Swift.h看到如下的程式碼:
- 否則會看到如下的程式碼:
- 如果有成功的話,會在ProductModuleName-Swift.h看到如下的程式碼:
- ProductModuleName-Swift.h內容無法修改,所以務必依照Apple官方文件(Ref (1))的規則去撰寫Swift code
- ProductModuleName-Swift.h這個自動產生的檔案,在Build setting中,有欄位去參考這個檔案的位置:
- 其他補充: ProductModuleName-Swift.h是Importing Swift to Objective-C需要用的
- 其他補充: 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