前言
在OC中, 有時(shí)候我們定義了一個(gè)變量,但是暫時(shí)又不用它,此時(shí)我們的做法就是將其賦值為0(基本數(shù)據(jù)類型)或者nil(OC對象). 但是在Swift中, nil是一個(gè)特殊的類型, 如果與真在實(shí)的類型不匹配是不能對其賦值的(注意:OC是弱語言,Swift是強(qiáng)語言) , 但是在開發(fā)中很多時(shí)候我們都有賦值為nil的情況, 所以在swift中推出了可選類型
可選類型的概念
可選類型: 所謂的可選類型就是說一個(gè)變量可能沒有值也有可能有值
可選類型格式
格式: 修飾符 變量名稱: Optional<數(shù)據(jù)類型>
但是在swift提供類一個(gè)語法糖使用"?"代替了Optional
格式: 修飾符 變量名稱:數(shù)據(jù)類型?
- 可選類型的定義
// 1, 首先我們來看看錯誤的寫法
let str: String = nil // 這里會直接報(bào)錯,不能給變量或者常量直接賦值為nil
// 2, 再來看看正確的寫法
// 方式一:
let str: Optional<String> = nil
// 方式二: (推薦寫法)
let str:String? = nil
- 可選類型的使用
var name: String? = nil
print(name)
//name = 10086 // 注意一點(diǎn): 不同類型直接是不能賦值的,所以這里會報(bào)錯
name = "William"
print(name)
- 強(qiáng)制解包
在Swift中如果我們使用了可選類型,那么在使用到該變量/常量時(shí),一定要進(jìn)行解包操作
格式: 只需要在變量或者常量后面加上"!"即可
"!"表示該變量或者常量是一定有值的,如果強(qiáng)制解包的變量或者常量是為空,那么Xcode會立即報(bào)錯
- 注意點(diǎn):
- 1, 在開發(fā)中最好不要強(qiáng)制解包一個(gè)可選類型,有時(shí)候會引發(fā)錯誤
- 2, 在開發(fā)中盡量使用可選綁定: 比如說我有一個(gè)url,它可能有值,也可能沒有值,如果我們使用可選綁定,系統(tǒng)內(nèi)部會自動將解包后的值賦值給temp, 這樣的話,只有當(dāng)temp有值的時(shí)候才會執(zhí)行{}中的代碼.
// 可選類型的使用
/*
這里我們直接使用語法糖的方式, 開發(fā)中用的幾乎都是用語法糖
*/
var name: String? = nil
print(name)
//name = 10086 // 注意一點(diǎn): 不同類型直接是不能賦值的,所以這里會報(bào)錯
name = "William"
print(name)
/*
這里需要注意: 打印出來的結(jié)果是Optional<"William"> : 表示的意思是:name是一個(gè)可選類型,并且可選類型中存儲的是一個(gè)William的字符串
如果想要去除Optiopnal可以直接對其做解包操作 即:可選類型 + 感嘆號("!")
*/
print(name!)
特別注意: 在使用可選類型取值時(shí), 需要通過感嘆號!來取值,這個(gè)操作我們常常稱之為"強(qiáng)制解包"
強(qiáng)制解包的意義是告訴Xcode該變量或者常量是一定有值的, 如果強(qiáng)制解包一個(gè)沒有值得可選類型,程序會直接崩掉, 所以說強(qiáng)制解包是一個(gè)非常危險(xiǎn)的操作
解決的方法就是在強(qiáng)制解包之前進(jìn)行一個(gè)判斷,判斷可選類型是否為空(但是不推薦使用),因?yàn)槊看卧L問的時(shí)候都會要使用"!"
- 可選綁定
- 判斷可選類型是否有值, 如果有值,則就會執(zhí)行{}中的代碼
換句話說: 如果可選類型有值則系統(tǒng)內(nèi)部就會對可選類型進(jìn)行解包,并且將值賦值給temp
之后就能通過temp進(jìn)行訪問可選類型
解釋一下: 在實(shí)際開發(fā)中,比如說用到網(wǎng)絡(luò)地址時(shí),獲取到的地址可能是有值,也有可能是沒有值得,所以在開發(fā)中最好不要直接強(qiáng)制解包,如果說可選類型為空,你再去強(qiáng)制解包,程序就是直接崩掉.所以在強(qiáng)制解包之前最好是判斷一下可選類型是否為空.有以下兩種方式.
- 直接使用if判斷
let number: String?
// 如果直接解包,就會直接報(bào)錯
//print(number!)
number = "15989854481"
// 方式一: 不推薦使用這種方式
if number != nil {
print(number!)
}
- 可選綁定
let number: String?
// 如果直接解包,就會直接報(bào)錯
//print(number!)
number = "15989854481"
if let temp = number {
print(temp)
}
- 可選類型的實(shí)例
//let URL: NSURL? = NSURL(string: "http://www.baidu.com")
let URL = NSURL(string: "http://www.baidu.com")
print(URL!) //這樣一點(diǎn)都不嚴(yán)謹(jǐn),如果URL中有特殊字符或者漢字或者為空,那么這里就會報(bào)錯
// 解決方法 : 先判斷是否為空或者可選綁定
// 方式一: 判斷 (但是不推薦使用,因?yàn)槊看卧L問都需要使用!)
if URL != nil {
print(URL!)
}
// 方式二: 可選綁定 (推薦使用)
let URL = NSURL(string: "http://www.baidu.com")
print(URL!) //這樣一點(diǎn)都不嚴(yán)謹(jǐn),如果URL中有特殊字符或者漢字或者為空,那么這里就會報(bào)錯
if let temp = URL {
print(temp)
temp
}
- 實(shí)例 2
let view: UIView = UIView()
view.frame = CGRectMake(100, 100, 50, 50)
view.backgroundColor = UIColor.redColor()
print(view.backgroundColor)
if let colorTemp = view.backgroundColor {
print(colorTemp)
}
- 實(shí)例總結(jié)
比如說在開發(fā)中常常會通過一個(gè)url去請求數(shù)據(jù),但是這個(gè)url可能有值也有可能沒有值,比如說在url中有漢字的情況,所以就會返回一個(gè)nil的url, 所以url就是一個(gè)可選類型.
// 錯誤寫法: 直接就會報(bào)錯
let url; NSURL = NSURL(string: "www.baidu.com")