Swift混編

OC與Swift混編(基于Swift 4.1)

1古徒、在OC項(xiàng)目中,新建一個(gè)swift文件后會(huì)提示要不要自動(dòng)新建Bridging_Header柱搜,由于項(xiàng)目中存在多個(gè)target块茁,自動(dòng)新建會(huì)新建多個(gè),所以不是很推薦這種方式辫狼,自己新建也很方便初斑,新建header file后,在Build Settings -> Swift Compiler - general -> Objective-C Bridging Header中寫入即可膨处,然后在Objective-C Bridging Header的下方有一欄Objective-C Generated Interface Header Name是系統(tǒng)生成的文件见秤,固定格式為項(xiàng)目名-Swift.h

  • Bridging_Header文件可以理解為swift版本的PCH文件真椿,但只能給swift文件使用鹃答,由于swift文件無(wú)法直接importOC文件,混編時(shí)突硝,需要在Bridging_Header中import好OC類测摔;
  • 項(xiàng)目名-Swift.h這個(gè)文件是OC調(diào)用swift類需要用到的,同理上一條解恰,OC中也是無(wú)法直接importswift的锋八,但是可以import這個(gè)文件,并且項(xiàng)目名-Swift.h也是不需要我們自己維護(hù)护盈,只要OC中import了該文件挟纱,就可以直接使用了,所以我是把項(xiàng)目名-Swift.h放在了OC的PCH中黄琼。

2樊销、(重要)網(wǎng)上混編的文章都是通過demo來(lái)演示的整慎,并沒有實(shí)際項(xiàng)目中復(fù)雜且各種父類宏的使用,所以在說(shuō)完第一點(diǎn)之后就直接開始編寫了围苫,并沒有提到可能會(huì)遇到的坑裤园,我雖然只修改了一個(gè)VC,但總結(jié)下來(lái)的話也有下面幾點(diǎn):

  • Bridging_Headerimport是沒有提示的<粮E±俊!
  • Bridging_Headerimport是不會(huì)加載被import文件中的其他類腺占,如果用到需要另外再import淤袜;
  • Bridging_Header中被import的OC文件一定要確保用到的類被正確import,否則會(huì)報(bào)文件未找到衰伯;
  • 由于Swift無(wú)法公用OC的宏定義铡羡,所以還要確保在Bridging_Header中被import的.h文件沒有用到OC的宏定義,例如通用的block回調(diào)之類意鲸。

在寫代碼過程中烦周,可能會(huì)遇到系統(tǒng)提示fix給參數(shù)添加了? ! ??之類的字符。

可選值

打包wrap(?)

怎顾? 表示有值或者為空读慎。Eg: var name : String? 表示name可能有值也可能為空,可以理解為可選值類型是一個(gè)盒子槐雾,這個(gè)盒子有有值和無(wú)值兩種情況夭委,也就是可選值變量對(duì)有值或無(wú)值進(jìn)行了打包操作。

var a :Int?
var b :Int

雖然都是Int類型募强,但實(shí)際上a和b是不一樣的株灸,a屬于可選Int類型,b屬于Int類型钻注。

  • eg:
var aaa: Int? = 30
print(aaa)

會(huì)報(bào)一個(gè)Expression implicitly coerced from 'Int?' to Any的警告蚂且,意思是把可選值類型隱式地強(qiáng)制轉(zhuǎn)換成任意類型來(lái)處理,可修改為print(aaa as Any)消除警告幅恋。
但這并不好杏死,因?yàn)檫€有隱患

print(aaa + 1)

這樣更能直白的表示出可選值和非可選值的區(qū)別,會(huì)直接報(bào)錯(cuò):Value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?捆交,提示沒有對(duì)Int?進(jìn)行解包unwrapped淑翼,且直接對(duì)可選類型做了加一操作,Swift是強(qiáng)類型語(yǔ)言品追,在編譯階段就為我們排除了很大一部分的類型不匹配的錯(cuò)誤玄括,例如OC中int和float類型相加并不會(huì)報(bào)錯(cuò)隱式類型轉(zhuǎn)換,而在Swift中則不行肉瓦,所以這里相當(dāng)于是將可選值的盒子進(jìn)行了加一的操作遭京,而不是對(duì)可選值盒子中的內(nèi)容進(jìn)行加一,就報(bào)錯(cuò)了哪雕。

解包Unwarpping optionals

既然有打包船殉,那么肯定就有解包斯嚎,就是把值從盒子內(nèi)取出來(lái)

  • 1、強(qiáng)制解包Force unwrapping(!)

針對(duì)上面的例子

print(aaa! + 1)

這樣就解包了堡僻,變量名后的感嘆號(hào)告訴編譯器糠惫,我想看下盒子里面的內(nèi)容并取出來(lái)里面的值钉疫,但是,使用強(qiáng)制解包應(yīng)該謹(jǐn)慎的使用陌选。
還是針對(duì)上面的例子蹄溉,由于aaa被定義為可選值變量咨油,在使用過程中可能會(huì)置換為nil

var aaa: Int? = 30
aaa = nil
print(aaa! + 1)

這樣就會(huì)報(bào)錯(cuò)Fatal error: Unexpectedly found nil while unwrapping an Optional value柒爵,錯(cuò)誤原因是對(duì)一個(gè)值為空的變量進(jìn)行了解包,當(dāng)然可以在每次解包的時(shí)候判斷是否為nil棉胀,但這無(wú)疑是增加了自己的代碼及工作量法瑟,并且如果萬(wàn)一忘記了的話唁奢,程序還是會(huì)崩潰霎挟。
所以對(duì)于強(qiáng)制解包,推薦是只有在確定不為空的情況下才使用的

  • 可選值綁定Optional binding(iflet)
var aaa: Int? = 30
aaa = nil
if let bbb = aaa {
    print(bbb + 1)
} else {
    print("no")
}

上面的代碼使用了iflet表達(dá)式來(lái)進(jìn)行了綁定麻掸,如果可選值內(nèi)容不為空酥夭,那么就會(huì)被解包,并且let的常量名可定義為相同的脊奋,如:

var aaa: Int? = 30
aaa = nil
if let aaa = aaa {
    print(aaa + 1)
} else {
    print("no")
}
  • 空值合并Nil coalescing(??)
var aaa: Int? = 30
aaa = nil
var bbb = aaa ?? 20
print(bbb + 1)

這也是一種解包熬北,叫做空合運(yùn)算符,類似于三目運(yùn)算符诚隙,上面??的意思表示如果aaa不為nil讶隐,那么就將aaa的值給bbb,否則將bbb賦值為20久又。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巫延,一起剝皮案震驚了整個(gè)濱河市效五,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炉峰,老刑警劉巖火俄,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異讲冠,居然都是意外死亡瓜客,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門竿开,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谱仪,“玉大人,你說(shuō)我怎么就攤上這事否彩》柙埽” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵列荔,是天一觀的道長(zhǎng)敬尺。 經(jīng)常有香客問我,道長(zhǎng)贴浙,這世上最難降的妖魔是什么砂吞? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮崎溃,結(jié)果婚禮上蜻直,老公的妹妹穿的比我還像新娘。我一直安慰自己袁串,他們只是感情好概而,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著囱修,像睡著了一般赎瑰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上破镰,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天餐曼,我揣著相機(jī)與錄音,去河邊找鬼啤咽。 笑死晋辆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宇整。 我是一名探鬼主播瓶佳,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼鳞青,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼为朋!你這毒婦竟也來(lái)了厚脉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤霞溪,失蹤者是張志新(化名)和其女友劉穎中捆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泄伪,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蟋滴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肖粮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片球散。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悲龟,到底是詐尸還是另有隱情,我是刑警寧澤须教,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站乐疆,受9級(jí)特大地震影響贬养,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜误算,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一迷殿、第九天 我趴在偏房一處隱蔽的房頂上張望庆寺。 院中可真熱鬧,春花似錦懦尝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至墨叛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扁凛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工谨朝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甥绿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓洗出,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親翩活。 傳聞我的和親對(duì)象是個(gè)殘疾皇子便贵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361