可選類型
聲明變量或常量的時候,代表可以有值采幌,也可以無值劲够。在類型標(biāo)注后面,用休傍?表示當(dāng)其沒有值時可以賦值nil
如果一個變量和常量是非可選類型的話征绎,不能賦值為nil
let assumedString: String? = nil //可以被賦值為nil
let implicitString: String = nil //不可以
如果要判斷一個非可選類型的變量或常量是否為空,不能這樣判斷? xxx != nil
let forcedString:String = possibleString!
let implicityString:String = "hello"
if implicitString != nil { //不能這樣判斷磨取,會報錯
}
nil 不是一個指向不存在對象的指針人柿,它是一個確定的值,如果聲明了一個可選類型的變量(注意沒有常量)而不賦值柴墩,Swift會給它默認(rèn)是nil
var A:String? // 默認(rèn)是nil
var B:String? //只是聲明了,swift沒有給它默認(rèn)賦值凫岖,不能對它進(jìn)行操作
總之一個變量或常量有可能是nil拐邪,就聲明為可選類型比較安全,因為非可選類型不能為nil
我要親你了哦
隱式解析可選類型
可選類型代表著一個變量或常量可能為nil隘截,但是非可選類型不能賦值為nil
那么扎阶,問題來了!
賦值的時候怎么確定一個可選類型是有值的呢婶芭?
比如像這樣
var dog :String东臀? = "wangcai" //dog變量想要給一個非可選類型的cat變量賦值
let cat:String = dog? //cat說,滾犀农,我怎么知道你是不是nil惰赋,你這個可選類型!
你看看呵哨,不能怨cat啊赁濒,dog如果是nil的話,cat是非可選類型的不能為nil就會報錯啊
所以dog就在后面加了個尾巴孟害!代表我有值拒炎!
var dog :String? = "wangcai" //dog變量想要給一個非可選類型的cat變量賦值
let cat:String = dog挨务!? //cat說击你,嗯,我已經(jīng)拿到啦谎柄,么么噠丁侄!
這個!是多么的重要啊
但是反而想朝巫,可選類型每次給別人賦值都要在后面加個鸿摇!是多么的費事
如果可選類型給可選類型賦值不用操心,因為被賦值的是個可選類型可以被賦值為nil劈猿,所以不用加 拙吉!也行。
如下圖:
var dog :String? = "wangcai" //dog變量想要給一個可選類型的cat變量賦值
let cat:String? = dog? //cat說糙臼,都是可以被賦值為nil的庐镐,所以不用擔(dān)心被你坑
如果是接下來的情況就很費心了
var dog :String! = "wangcai" //dog變量想要給一個非可選類型的cat變量賦值
let cat:String = dog恩商!? //cat說变逃,嗯,我已經(jīng)拿到啦怠堪,么么噠揽乱!
let tiger:String = dog名眉! //hello,我是旺財~
let fish:String = dog凰棉!? //我是旺財~
let bird:String = dog损拢!? //旺財。撒犀。福压。
let sheep:String = dog! //為什么每次都得驗證一遍
let mouse:String = dog或舞! //心好累
其實這個時候dog變量只要聲明一下自己是隱式解析可選類型就不用費心啦荆姆,只要在第一次的時候賦值不為nil就好
var dog :String! = "wangcai" //dog變量想要給一個非可選類型的cat變量賦值
let cat:String = dog? //cat說,嗯映凳,我已經(jīng)拿到啦胆筒,么么噠!
let tiger:String = dog //ok
let fish:String = dog? //ok
let bird:String = dog? //ok
let sheep:String = dog //ok
let mouse:String = dog //ok
如圖诈豌,不需要每次都加‘仆救!’一步到位!=糜妗M巍!
所以隱式解析可選類型就相當(dāng)于默默地在每一個可選類型的后面加庙洼!
隱式解析可選類型 = 默默地+給可選類型+加铆惑!號
以下是后來修改內(nèi)容。送膳。员魏。。
知識擴展叠聋,剛剛上文說了
非可選類型都不能賦值為nil撕阎,那么隱式解析可選類型能不能賦值為nil呢
。
碌补。
虏束。
。
厦章。
答案是可以
隱式解析可選類型可以像可選類型一樣被賦值為nil镇匀,這就體現(xiàn)出來隱式可選類型的優(yōu)點即可用被賦值為nil,也可以不用每次展開訪問值袜啃。
具體隱式解析可選類型的用法是在類中做屬性解決循環(huán)引用問題汗侵。
轉(zhuǎn)載自<民謠程序員?>