iOS混編,大概意思是Objective-C(后面簡稱OC)工程里面會用到用Swift寫的代碼文件热康,或者是Swift工程里面用到用OC寫的代碼文件沛申;大概分為以下幾種情況
- OC工程直接拖入使用.swift文件
- OC工程pod 引入Swift第三方庫文件
- Swift工程里面直接拖入使用OC,.h/.m文件
- Swfit工程里面pod 引入OC第三方庫文件
OC工程直接拖入使用.swift文件
先給結論:
一 需要把swift文件里面的struct,改為類姐军,并且繼承自NSObject
二 在類文件中需要加@objc 或者@objcMembers
三 swift文件里面如果有枚舉類型铁材,能轉為OC代碼的前提是:
- 1.加@objc尖淘,同上面;
- 2.枚舉的原始值類型是Int型著觉,并且不能有相關值村生,因為OC里面的枚舉只有Int類型,而且沒有相關值的概念饼丘。
- 3.swift里面枚舉類型不能為可選型趁桃,因為OC里面的枚舉不可以為空
第一步
在OC工程,當拖入第 一swift文件肄鸽,或者新建第一個swift文件時卫病,會彈出一個創(chuàng)建橋接頭文件的窗口,這個需要選擇“create Briging Header”,后面我們會用這個頭文件
橋接文件的格式 “XXX-Bridging-Header.h”,其中“XXX”是工程的名稱典徘,如下圖所示
第二步
如上圖所示蟀苛,先來看一下我們的swift文件,里面是一個結構體Person
烂斋,在OC里面是沒有結構體屹逛,只有類的概念础废,所以正常swift里面的結構體是不能自動轉為OC里面的類的汛骂,所以應該不會有任何反應的
我們在ViewController里面導入#import "XXX-Swift.h"
,XXX
同樣是工程名稱,如下圖
編譯评腺,看一下帘瞭,導入一個swift文件后,OC工程會不會報錯蒿讥,幸運的是不會編譯報錯蝶念。這個時候嘗試敲一個Person
這個類名,看編譯器會不會給出提示
結果是沒有任何提示芋绸,也就說明了結構體媒殉,是不能自動轉化為OC相應代碼
那我們能不能嘗試加@objc,讓其能轉化呢? **(加@objc摔敛,是讓swift代碼能自動轉化為OC代碼的主要方法)**
如上圖所示廷蓉,直接提示,@objc马昙,應該用在類身上桃犬。所以一個小小的結論:
Swift里面的結構體是不能轉為OC代碼,也就不能在OC工程里面使用的
第三步
我們把Person
改為類的形式行楞,如下所示攒暇,然后在ViewController里面看有沒有提示
如上圖,還是沒有任何提示子房;
那我們再加@objc形用,而且根據(jù)提示就轧,
Person
類要繼承NSObject類,再來看看編譯器會不會給我們提示可以看出是可行的田度,
Person
類已經可以被編譯器自動提示出來了钓丰。這個時候那些沒有加@objc的屬性和方法還是不能用的,所以我們得去全部加@objc每币;
在加@objc之前携丁,我們先按住“Command”鍵和"OCDemo-Swift.h",跳進去看一下
里面已經根據(jù)swift里面的代碼兰怠,生成對應的OC代碼了梦鉴,目前只有一個init方法;與上面說法
這個時候那些沒有加@objc的屬性和方法還是不能用的
;是相符的揭保;
好了肥橙,我們趕緊全部加上@objc,再來看一下秸侣,ViewController界面有沒有提示存筏,同時也再進"OCDemo-Swift.h",里面去看看味榛,會不會生成更多的代碼椭坚;如下所示,確實如我們所想
如果我們類中的屬性和方法很多怎么辦搏色,也需要這么麻煩一個一個加@objc么善茎,這個時候,我們可以使用一個更高級的關鍵詞@objcMembers
,加上它后频轿,就相當于垂涯,所以屬性和方法都加了@objc,如下
上面已經驗證了結論一航邢,結論二耕赘,現(xiàn)在我們來驗證結論三,swift中的枚舉
我們先在Persion.swift文件里面增加枚舉膳殷,Cmd+B編譯一下操骡,沒有報錯,但此時還沒有加@objc
當我們加@objc后秽之,就直接報錯当娱,需要integer類型
我們就按報錯的提示來進行修改,結果如下
OC工程pod 引入Swift第三方庫文件
結論跟前面一樣考榨,使用步驟稍有不同:
一 需要把swift文件里面的struct跨细,改為類,并且繼承自NSObject
二 在類文件中需要加@objc 或者@objcMembers
三 swift文件里面如果有枚舉類型河质,能轉為OC代碼的前提是:
- 1.加@objc冀惭,同上面震叙;
- 2.枚舉的原始值類型是Int型,并且不能有相關值散休,因為OC里面的枚舉只有Int類型媒楼,而且沒有相關值的概念。
- 3.swift里面枚舉類型不能為可選型戚丸,因為OC里面的枚舉不可以為空
我們就拿一個swift庫來做演示Charts
,用cocospod的方式安裝到工程里面如下圖所示
使用步驟:
在橋接文件里面導入Charts模塊
@import Charts;
(導入過程可能沒有代碼提示)
在使用的地方划址,導入橋接文件#import "OCDemo-Bridging-Header.h"
,其中OCDemo
是項目工程的名稱
然后就可以看到當敲部分chartView代碼,編譯器就能把各種頭文件提示出來限府,就可以正常使用這個swift庫了
Swift工程里面直接拖入使用OC,.h/.m文件
直接拖入一個Student
類
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Student : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) double score;
-(void)learn;
@end
NS_ASSUME_NONNULL_END
#import "Student.h"
@implementation Student
- (NSString *)name {
return self.name;
}
- (void)setName:(NSString *)name {
self.name = name;
}
- (double)score {
return self.score;
}
- (void)setScore:(double)score {
self.score = score;
}
- (void)learn {
NSLog(@"learn");
}
@end
需要做的夺颤,就是在橋接文件SwiftDemo-Bridging-Header.h
里面,導入OC的類
#import "Student.h"
然后就可以在使用的地方胁勺,用起來
Swfit工程里面pod 引入OC第三方庫文件
我們先Pod一個純OC庫pod 'SVProgressHUD'
,
然后步驟同上世澜,先在橋接文件中 導入OC頭文件,然后直接使用OC的類署穗,如下圖所示
實踐案例
在OC工程里面處理以下幾種情況
- OC ViewController里調用自定義OC類
- OC ViewController里調用Pod進來OC類
- OC ViewController里面調用自定義Swift類
- OC ViewController里面調用Pod進來Swift類
- Swift ViewController里調用自定義OC類
- Swift ViewController里調用Pod進來OC類
- Swift ViewController里面調用自定義Swift類
- Swift ViewController里面調用Pod進來Swift類
有經驗的小伙伴寥裂,應該會想到為什么有以上的這么種情況,比如:一個OC ViewController 會push到一個Swift ViewController案疲,然后Swift ViewController 又push到下一級OC ViewController封恰;這樣的混編場景是可能遇到的,就會遇到上面的8種情況络拌。只有處理好上面的8種情況俭驮,才算真正意義上實現(xiàn)了混編回溺。
OC文件使用其他文件的導入方式春贸,處理1~4的情況;如下圖
Swift文件使用其他文件的導入方式遗遵,處理5~8的情況萍恕;如下圖
在橋接文件需要如下的導入方式,這個是重點车要,這個是重點允粤,這個是重點
(這個好像其他博主,都沒有提到翼岁。),在這里導入后类垫,其他swift文件就可以直接使用 橋接文件導入OC文件和swift文件
實戰(zhàn)demo放在某盤,有需要的小伙伴自取吧
鏈接: https://pan.baidu.com/s/18dlFqBsl3iCRzhF0CmGHfw 提取碼: rwtf
Github地址請點擊這里
結尾
今天的分享至此接近尾聲嘍琅坡,小伴們,覺得有點用的話悉患,或者已經看到這里面來的請點贊加關注吧~~ 后續(xù)分享更多iOS原生技術及物聯(lián)網技術相關文章。如果有疑問的話榆俺,歡迎在下方留言~