可選類型
聲明變量或常量的時候,代表可以有值,也可以無值。在類型標注后面,用?表示當其沒有值時可以賦值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會給它默認是nil
var A:String? // 默認是nil
var B:String? //只是聲明了,swift沒有給它默認賦值,不能對它進行操作
總之一個變量或常量有可能是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說,嗯,我已經拿到啦,么么噠!
這個!是多么的重要啊
但是反而想,可選類型每次給別人賦值都要在后面加個!是多么的費事
如果可選類型給可選類型賦值不用操心,因為被賦值的是個可選類型可以被賦值為nil,所以不用加 !也行。
如下圖:
var dog :String? = "wangcai" //dog變量想要給一個可選類型的cat變量賦值
let cat:String? = dog? //cat說,都是可以被賦值為nil的,所以不用擔心被你坑
如果是接下來的情況就很費心了
var dog :String! = "wangcai" //dog變量想要給一個非可選類型的cat變量賦值
let cat:String = dog!? //cat說,嗯,我已經拿到啦,么么噠!
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說,嗯,我已經拿到啦,么么噠!
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
如圖,不需要每次都加‘!’一步到位?。。。?/p>
所以隱式解析可選類型就相當于默默地在每一個可選類型的后面加!
隱式解析可選類型 = 默默地+給可選類型+加!號
以下是后來修改內容。。。。
知識擴展,剛剛上文說了
非可選類型都不能賦值為nil,那么隱式解析可選類型能不能賦值為nil呢
。
。
。
。
。
答案是可以
隱式解析可選類型可以像可選類型一樣被賦值為nil,這就體現出來隱式可選類型的優點即可用被賦值為nil,也可以不用每次展開訪問值。
具體隱式解析可選類型的用法是在類中做屬性解決循環引用問題。
轉載自<民謠程序員?>