標籤:報錯 png style ima sse .sh init 解決 方式
需求
我們建立一個Swift類型的工程,由於種種原因,裡面會有一些OC類,OC類用到了項目中的某些Swift類,而Swift類又用到了這些OC類,怎麼解決?
解答
其實,Swift和OC檔案是可以共存在一個工程中的,我們只需要簡單的配置,和一些注意細節,就可以實現Swift和OC的混編。
步驟1:配置OC的橋接檔案
1、在Swift裡第一次建立OC的檔案,會出現
注意:以後再建,或者是拖入的OC檔案,都不會有這個提示。
自己拖入的OC檔案,需要手動設定橋接檔案。
2、系統會自動建立一個標頭檔:工程名-Bridging-Header.h
3、如果想自訂這個標頭檔,把系統自動建立的刪除,建立標頭檔:
4、配置自己的標頭檔:
步驟2:Swift調用OC代碼
1、在橋接標頭檔裡匯入OC的標頭檔
2、OC檔案對外提供一個方法
1 #import <UIKit/UIKit.h>2 3 @interface OCVC : UIViewController4 5 - (void)showOCInfo;6 7 @end
1 #import "OCVC.h" 2 3 @interface OCVC () 4 5 @end 6 7 @implementation OCVC 8 9 - (void)viewDidLoad {10 [super viewDidLoad];11 }12 13 - (void)showOCInfo{14 NSLog(@"這是OC的方法");15 }16 17 @end
3、swift直接使用swift的代碼風格調用OC的方法就可以
1 import UIKit 2 3 class SwiftVC: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 view.backgroundColor = UIColor.white 8 } 9 10 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {11 12 // 建立OC控制器對象13 let ocVC = OCVC()14 15 // 調用OC控制器對象的方法16 ocVC.showOCInfo()17 }18 }步驟3:如果工程中的OC檔案想使用某些Swift的檔案,需要配置工程的swift標頭檔(系統產生:工程中找不到,但可以通過方法或屬性點進去)
1、swift提供方法或屬性,供外界調用
1 import UIKit 2 3 class SwiftVC: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 view.backgroundColor = UIColor.white 8 } 9 10 func showSwiftInfo() -> Void {11 print("這是Swift方法")12 }13 }
2、oc的.m檔案先匯入標頭檔,才可以調用,注意:一定是.m檔案匯入,而非.h匯入
#import "OCVC.h"// 標頭檔:工程名-swift.h// 注意了啊,這裡導標頭檔的時候,只能.m檔案中匯入,.h中不能匯入,否則會報錯// 還有,如果swift中聲明的屬性為 可選屬性(?),那麼對應的oc的標頭檔是不會有這個屬性的)#import "test-swift.h"
這時候,進行編譯,有可能會出錯,也有可能不會出錯,如果出錯的話,我們還需要手動設定一下。
我們可以先嘗試配置ProdctName,一般都不會有問題,如果還是不行,再嘗試配置ProductModuleName,然後進行編譯。
3、這時候,我們的OC檔案就可以愉快的使用OC的方式調用Swift代碼了
1 #import "OCVC.h" 2 // 標頭檔:工程名-swift.h 3 4 // 注意了啊,這裡導標頭檔的時候,只能.m檔案中匯入,.h中不能匯入,否則會報錯 5 6 // 還有,如果swift中聲明的屬性為 ?(即可選屬性,那麼對應的oc的標頭檔是不會有這個屬性的) 7 8 #import "test-swift.h" 9 10 @interface OCVC ()11 12 @end13 14 @implementation OCVC15 16 - (void)viewDidLoad {17 [super viewDidLoad];18 self.view.backgroundColor = [UIColor whiteColor];19 }20 21 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event22 {23 // 建立swift的控制器對象24 SwiftVC *swiftVC = [[SwiftVC alloc] init];25 26 // 調用swift控制器對象的方法27 [swiftVC showSwiftInfo];28 }29 30 @end
swift與oc混編