一: swift類型轉(zhuǎn)化的四種操作
Swift是強(qiáng)類型語(yǔ)言音念,但也允許開(kāi)發(fā)者通過(guò)is、as躏敢、as闷愤?和as!這四種操作來(lái)對(duì)類型進(jìn)行判斷和強(qiáng)制轉(zhuǎn)換件余。其中is用作類型判斷讥脐,而as?和as啼器!則分別是類型轉(zhuǎn)換的可選形式和強(qiáng)制形式旬渠。swift中比較常用的向下轉(zhuǎn)換(downcast)是沒(méi)有as操作符的,但是,如果現(xiàn)在有一個(gè)Dog類他的父類是一個(gè)Animal類,可以通過(guò)as將一個(gè)Dog類轉(zhuǎn)化為Animal類.
為了方便后面的解釋,這里假設(shè)定義了三個(gè)類端壳,Animal告丢、Dog和Cat,其中Dog和Cat都繼承自Animal更哄。
二: is操作符
is操作用來(lái)判斷某一個(gè)對(duì)象是否是某一個(gè)特定的類芋齿,它會(huì)返回一個(gè)bool類型的值腥寇。is操作的邏輯很簡(jiǎn)單,某一個(gè)類的對(duì)象肯定是自己這個(gè)類觅捆,也一定是自己的超類赦役,但超類的對(duì)象不是子類。如果兩個(gè)類沒(méi)有繼承關(guān)系栅炒,那is操作一定返回false.
如下:
if Dog is Animal {
print("這是個(gè)小狗")
}
if Cat is Animal{
print("這是個(gè)小貓")
}
if Animal is Cat {
print("動(dòng)物是一個(gè)貓")? // 這種判斷顯然不能成立,返回的是一個(gè)false
}
注意: 以上這種使用is做判斷,返回一個(gè)bool類型的結(jié)果,判斷一個(gè)類是不是另外一個(gè)類的類型,就相當(dāng)于我們?cè)贠C里面用到的isKindOfClass去判斷一樣
三: as轉(zhuǎn)化
使用as轉(zhuǎn)化,只能將一個(gè)子類轉(zhuǎn)化成一個(gè)父類(或者超類),反過(guò)來(lái)不能轉(zhuǎn)化成功
四:as!操作符
as掂摔!操作符是類型轉(zhuǎn)換的強(qiáng)制格式,優(yōu)點(diǎn)在于代碼簡(jiǎn)單赢赊,如果可以轉(zhuǎn)換乙漓,則會(huì)返回轉(zhuǎn)換了格式的對(duì)象,如果無(wú)法轉(zhuǎn)換就會(huì)拋出運(yùn)行時(shí)錯(cuò)誤释移。因此除非百分之百確定可以轉(zhuǎn)換叭披,否則不應(yīng)該使用as!來(lái)進(jìn)行強(qiáng)制類型轉(zhuǎn)換,易造成程序crash玩讳。
五:as涩蜘?操作符
as?和as熏纯!操作符的轉(zhuǎn)換規(guī)則完全一樣同诫,但是as?會(huì)返回一個(gè)被轉(zhuǎn)換類型的可選類型樟澜,需要我們解封误窖。因?yàn)榭蛇x類型即使值不存在轉(zhuǎn)化失敗也不會(huì)導(dǎo)致程序報(bào)錯(cuò),所以當(dāng)我們?cè)陂_(kāi)發(fā)的時(shí)候最好使用這種方式進(jìn)行轉(zhuǎn)化,除非我們有百分之百的把握才可以使用強(qiáng)制轉(zhuǎn)化