? ? swift強(qiáng)勢(shì)來(lái)襲,想要緊跟腳步,但之前OC的工程推倒重來(lái)在時(shí)間和實(shí)踐上都有點(diǎn)傷神,混編就是這個(gè)過(guò)渡的橋梁,使用混編,快速完成
在OC工程中首次創(chuàng)建swift文件或者swift中首次創(chuàng)建OC文件,都會(huì)給出提示是否自動(dòng)生成一個(gè)橋接文件,其實(shí)自動(dòng)生成是兩個(gè)文件,一個(gè)可見(jiàn)一個(gè)不可見(jiàn),但是這兩個(gè)文件的名稱都能在配置文件中找到,在使用之前先看個(gè)小實(shí)驗(yàn)......
1.使用前需要了解的配置
做個(gè)小實(shí)驗(yàn)(只用靜靜看著就好了):
1).target-->buildSetting--(輸入packaging)
a.前提條件:工程名字是TimingUsingPickerView
b.Product Module Name 設(shè)置成 "imooc"
c.Product Name設(shè)置成"imooc1"
d.Defines Module 系統(tǒng)默認(rèn)是No,此處還是用系統(tǒng)默認(rèn)的 ? ?(這個(gè)是經(jīng)過(guò)嘗試,設(shè)置成Yes 或者No在我目前使用的范圍內(nèi)并沒(méi)有什么影響,當(dāng)然個(gè)人涉及范圍有限,可能有什么未知的影響還沒(méi)觸及,感興趣可以嘗試,歡迎補(bǔ)充~_~)
配置如下:
2)在OC中創(chuàng)建swift文件 生成橋接文件和隱藏文件:
? ? target-->buildSetting--(輸入swift)
如圖,可以看到生成的文件名:
a.橋接文件" TimingUsingPickerView-Bridging-Header.h" 可見(jiàn)的,在工程中可查找到該文件(在swift調(diào)用OC文件)
b.imooc-Swift.h不可見(jiàn),但調(diào)用時(shí)可像查看系統(tǒng)類(lèi)的方法查看(在OC中調(diào)用swift文件)
經(jīng)實(shí)驗(yàn)發(fā)現(xiàn):
a.無(wú)論怎么改變,橋接文件的名字都是跟工程名保持一致.但是該文件是可以單獨(dú)創(chuàng)建,進(jìn)行配置的.具體操作步驟:創(chuàng)建一個(gè)頭文件,然后模仿"工程名-Bridging-Header.h"的形式命名,再查找target-->buildSetting--(輸入swift),在Bridging Header中進(jìn)行設(shè)置(一般還是建議使用系統(tǒng)自己創(chuàng)建)
b.生成的不可見(jiàn)文件imooc-Swift.h名字是受Product Module Name影響的.該文件不建議自己創(chuàng)建,所以需要自定義的一定在使用之前先設(shè)置好Product Module Name.
2.OC與swift文件的真正混用
實(shí)驗(yàn)條件可以忽略,但是為了避免不必要的麻煩,建議看了實(shí)驗(yàn)結(jié)果再往下走:
1)target-->buildSetting--(輸入packaging)-->設(shè)置Product Module Name (也可不設(shè)置,默認(rèn)是系統(tǒng)的)
2)在OC中首次創(chuàng)建swift或者在swift中首次創(chuàng)建OC,彈出提示,是否創(chuàng)建橋接文件
點(diǎn)擊確定,則會(huì)生成兩個(gè)文件:
TimingUsingPickerView-Bridging-Header.h 以工程名命名的橋接文件,可見(jiàn)
imooc-Swift.h 不可見(jiàn),在target-->buildSetting--(輸入swift)進(jìn)行查看
3)swift與OC的混用
? a.在swift中使用OC的文件
在自動(dòng)創(chuàng)建的橋接文件TimingUsingPickerView-Bridging-Header.h中,依次導(dǎo)入swift文件中需要使用的類(lèi),然后就可以使用了,不過(guò)在swift文件中得按swift的規(guī)則寫(xiě)了
?b.在OC中使用swift的文件
在OC中導(dǎo)入系統(tǒng)自動(dòng)生成的imooc-swift.h文件(不能直接查找到該文件,但是可以像查看系統(tǒng)類(lèi)的方法點(diǎn)擊進(jìn)入查看) ,就可以使用創(chuàng)建的swift文件,"...-swift.h"/"...-Swift.h"都可以
3.swift調(diào)用OC中的一些坑
OC 中宏定義 如果只是值類(lèi)型等簡(jiǎn)單的宏定義,swift也可直接調(diào)用,但是如果是比較復(fù)雜的方法,swift就只能呵呵了,這個(gè)時(shí)間建議創(chuàng)建方法可以使用swift中的延展extension
1)swift中簡(jiǎn)單宏使用如:
2)swift中不能使用OC中復(fù)雜的宏如:
當(dāng)不能使用的時(shí)候,就需要寫(xiě)成方法供swift使用,可以創(chuàng)建一個(gè)swift文件,然后添加需要的延展,如下圖:
3)創(chuàng)建的swift類(lèi),必須繼承自NSObject或者NSObject的派生類(lèi),否則編譯后不會(huì)生成對(duì)應(yīng)的轉(zhuǎn)換類(lèi),接下來(lái)驗(yàn)證一下(此處感謝 ?@小杰杰杰提示??)
a.首先創(chuàng)建一個(gè)Person類(lèi),不繼承NSObject
在OC中TestViewController.m中使用,記得引入"工程名-swift.h",出現(xiàn)如下圖的提示,此處按住"command"鍵,點(diǎn)擊Person,進(jìn)入到剛剛創(chuàng)建的Person類(lèi)(見(jiàn)上圖)
b.現(xiàn)在修改原來(lái)的Person類(lèi),繼承NSObject,如下圖,修改后要"command+B"編譯一下才能看到變化
同樣在OC中TestViewController.m中使用,記得引入"工程名-swift.h",未報(bào)錯(cuò),如下圖:
此時(shí),按住"command",點(diǎn)擊Person進(jìn)入,此處有驚喜,如下圖:
swift編寫(xiě)的Person類(lèi)對(duì)應(yīng)的轉(zhuǎn)換類(lèi).可以互相調(diào)用,玄機(jī)就在這里??
4)創(chuàng)建的swift類(lèi)中,寫(xiě)了一個(gè)枚舉,不繼承NSObject,此時(shí)定義一個(gè)該枚舉類(lèi)型的變量,發(fā)現(xiàn)橋接文件中沒(méi)有生成相應(yīng)的屬性,解決辦法:定義枚舉時(shí)需要手動(dòng)添加添加@objc,如下:
看來(lái)使用OC與swift混編還是有點(diǎn)限制的,使用時(shí)需謹(jǐn)慎,不過(guò),這些也已經(jīng)夠平時(shí)使用了
小結(jié):swift和OC混用,坑還是很多的,埋坑是個(gè)體力活,常運(yùn)動(dòng)是個(gè)好習(xí)慣...
以上僅是個(gè)人使用總結(jié),歡迎批評(píng)指正補(bǔ)充~~~~~~~