一、可選類型
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、昭化網(wǎng)站維護(hù)、網(wǎng)站推廣。有時(shí)候在Swift程序的表達(dá)式可以看到?和!等符號(hào),它們代表的含義是什么,這些符號(hào)都和可選類型有關(guān)。
有時(shí)候使用一個(gè)變量和常量,它保存的值可能有也可能沒(méi)有
1、比較給一個(gè)變量賦值nil,需要下面的表達(dá)式賦值
class Empoyee{ var int : = 0 var name:String = "" var job : String ="" } var emp : Employee? = nil //后面加上?號(hào)可以接受空值,不加?不能賦予空值 emp1=Employee() println(emp!.no)
如果Employee?沒(méi)有賦值,調(diào)用它的成員的時(shí)候可能出現(xiàn)fatal error:unexpected found nil while upwrapping an optional value.
2、引用代碼
emp1?.no=1000 emp1?.name="張三" emp1?.job="clerk"
3、再看示例
func divided(n1:Int,n2:Int)->Double?{ if n2==0{ return nil } Double(n1)/Double(n2) } let result : Double? = divide(100,200)
使用原則:如果一個(gè)常量、變量或函數(shù)能夠接受nil空值,那就需要給這個(gè)類型設(shè)為可選類型(正常類型+?),允許接受nil控制則是正常類型
(1)強(qiáng)制拆封
如果我們能確定可選類型一定有值,那么在讀取它的時(shí)候,可以在可選類型的后面加一個(gè)感嘆號(hào)(!)來(lái)獲取該值,這種感嘆號(hào)的表達(dá)方式稱為可選類型的強(qiáng)制拆封,如下代碼所示:
let result1 :Double? = divided(10,20)
println(result1!)
println對(duì)result1中的語(yǔ)句進(jìn)行了強(qiáng)制拆封
前問(wèn)號(hào),后感嘆號(hào),強(qiáng)制拆封
(2)隱式拆封
為了能夠方便的訪問(wèn)可選類型,可以將可選類型后面的問(wèn)號(hào)改成感嘆號(hào)(!),這種可選類型在拆封時(shí)變量和常量不加感嘆號(hào)的方式稱為隱式拆封,如下代碼所示:
let result3 : Double! = divided(10,20)
println(result3)
在變量或常量聲明的時(shí)候,數(shù)據(jù)類型后面跟的是感嘆號(hào)而不是問(wèn)號(hào),在拆封的時(shí)候,變量或常量后面不用加感嘆號(hào),這就是隱式拆封,隱式拆封的變量或常量使用起來(lái)就像普通變量或常量一樣
前感嘆后省略,隱式拆封
(3)可選類型的綁定
可選類型賦值有風(fēng)險(xiǎn)性,可以先判斷再賦值,如下代碼所示:
func divided(n1:Int,n2:Int)->Double?{ if n2==0{ return nil } Double(n1)/Double(n2) } if let result : Double = divided(10,20) { let sum = 10.2 + result println(sum) }
調(diào)用函數(shù)進(jìn)行計(jì)算,然后把結(jié)果直接賦值給變量或常量,如果result不為nil,則if語(yǔ)句的邏輯變大時(shí)為true, 這種可選類型在if 或while語(yǔ)句中進(jìn)行判斷賦值,叫做可選綁定。
二、可選鏈
class Empoyee { var no:Int = 0 var name : String = "tony" var job:String? = "" var salary:Double = 0 var dept : Deartment = Department() } class Department { var no : Int = 0 var name:String = "sales" var com:Company = Company() } class Company { var no : Int = 0 var name : String = "" } var emp = Employee() println(emp.dept.com.name)
給定一個(gè)Employee實(shí)例,通過(guò)代碼emp.dept.com.name 可以引用到Company實(shí)例,形成一個(gè)引用的鏈條,但是這個(gè)鏈條的人一個(gè)環(huán)節(jié)斷裂,都無(wú)法引用到最后的目標(biāo)。
修改代碼如下:
2、Employee、Department,Company可以沒(méi)有對(duì)應(yīng)關(guān)系
class Empoyee { var no:Int = 0 var name : String = "tony" var job:String? = "" var salary:Double = 0 var dept : Deartment? = Department() } class Department { var no : Int = 0 var name:String = "sales" var com:Company? = Company() } class Company { var no : Int = 0 var name : String = "" } var emp = Employee() println(emp.dept!.com!.name)
但是強(qiáng)制拆封有一個(gè)弊端,如果可選鏈中某個(gè)環(huán)節(jié)為nil,將會(huì)導(dǎo)致代碼運(yùn)行時(shí)錯(cuò)誤,可以采用更加溫柔的引用方式,使用問(wèn)號(hào)?來(lái)代替感嘆號(hào)!,如下所示:
println(emp.dept?.com?.name)
?問(wèn)號(hào)表示引用的時(shí)候,如果某個(gè)環(huán)節(jié)為nil,她不會(huì)出現(xiàn)錯(cuò)誤,而是把nil返回給引用者,這種使用問(wèn)號(hào)引用可選類型的方式叫做可選鏈
三、使用問(wèn)號(hào)?和感嘆號(hào)!的總結(jié)
1、可選類型中的問(wèn)號(hào)?
聲明這個(gè)類型為可選類型,訪問(wèn)這種類型的常量或變量時(shí)要使用感嘆號(hào)!
2、可選類型中的感嘆號(hào)!
聲明這個(gè)類型也是可選類型,但是訪問(wèn)這種類型的常量或變量時(shí)不適用感嘆號(hào)!,下列代碼是隱式拆封:
let result3 : Double! = divide(10,20)
println(result3)
3、可選類型中的感嘆號(hào)
多個(gè)對(duì)象具有關(guān)聯(lián)關(guān)系,當(dāng)從一個(gè)對(duì)象引用另一個(gè)對(duì)象的方法、屬性和下標(biāo)的成員時(shí),就會(huì)形成引用鏈,由于這個(gè)鏈條某些環(huán)節(jié)可能有錢(qián),有些可能沒(méi)值,因此需要如下方法引用:
emp.dept!.com!.name
4、可選鏈中的問(wèn)號(hào)
在可選鏈中使用感嘆號(hào)訪問(wèn)時(shí),一旦鏈條某些環(huán)節(jié)沒(méi)值,程序?qū)?huì)發(fā)生異常,于是可把感嘆號(hào)改成問(wèn)號(hào),如下所示:
emp.dept?.com?.name
這樣某些環(huán)節(jié)沒(méi)值會(huì)返回nil,不會(huì)出現(xiàn)異常
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。