1.定義:也就是可選類型,允許將值設(shè)置為nil揭朝。
在類型名稱后面加個(gè)問(wèn)號(hào)队贱?來(lái)定義可選類型
var name :String? = "Lu"
name = nil
var age : Int?//默認(rèn)就是nil
age = 10
age = nil
可選項(xiàng)是對(duì)其他類型的一層包裝,可以將她理解為一個(gè)盒子
如果是nil潭袱,則是一個(gè)空盒子柱嫌,
不為nil則,盒子里面裝的是被包裝類型的數(shù)據(jù)
如果要獲取可選項(xiàng)的數(shù)據(jù)屯换,就要對(duì)可選項(xiàng)進(jìn)行拆包编丘,就是強(qiáng)制解包。使用!進(jìn)行強(qiáng)制解包
var age2:Int? = 10
let age3 = age2! + 1
var test:Int? = 1
let test2 = test!
如果對(duì)值為nil的空盒子進(jìn)行解包瘪吏,那么會(huì)產(chǎn)生運(yùn)行時(shí)的錯(cuò)誤(Unexpectedly found nil while unwrapping an Optional value:)
2.判斷可選項(xiàng)是否包含值
let aa = Int("123");
if (aa != nil) {
print("解包成功:\(aa ?? 0)")
} else {
print("解包失敗")
}
- 可選項(xiàng)綁定:使用可選項(xiàng)綁定癣防,判斷可選項(xiàng)是否包含值如果包含,就自動(dòng)解包把值賦值給臨時(shí)變量或者常量掌眠,并且返回 true或者false
if let number = Int("456") {
/// number是強(qiáng)制解包后的int值
print(number)
}
enum Season : Int {
case winter,summer,spring,autumn
}
if let suitSeason = Season(rawValue: 2) {
switch suitSeason {
case .winter:
print("winter")
case .summer:
print("summer")
case .spring:
print("spring")
case .autumn:
print("autumn")
}
} else {
print("沒(méi)有合適季節(jié)")
}
2.1 三重條件判斷
if let age3 = Int("55"),
let age4 = Int("44"),
age3 < age4 && age4 > 40 {
}
3.空合并運(yùn)算
a ?? b a是可選項(xiàng)蕾盯;b是可選或非可選;b和a的存儲(chǔ)類型相同蓝丙; a不為nil级遭,返回a;a為nil,則返回b渺尘; b是不可選選項(xiàng)挫鸽,則a自動(dòng)解包
let cc : Int? = 10
let bb : Int? = 20
let dd = cc ?? bb
print(dd as Any)
let temp2 : Int? = nil
let temp3 : Int? = 9
let temp41 = temp2 ?? temp3
if let temp4 = temp2 ?? temp3 {/// temp4是解包后的值9
print(temp4)
}
4.guard語(yǔ)句:
guard條件定義的變量或者常量,外層區(qū)域也可以使用.條件不成立才執(zhí)行里面的代碼鸥跟。與 continue break return等一起用丢郊,退出流程
func login(_ info:[String : String] ) -> Void {
guard let name = info["userName"] else {
print("請(qǐng)輸入用戶名")
return
}
guard let pwd = info["password"] else {
print("請(qǐng)輸入密碼")
return
}
print("用戶名:\(name),密碼:\(pwd)")
}
5.隱式解包
在類型后面加個(gè)感嘆號(hào)!就是隱私解包。適用于:1.確保一定有值 2.為了快速訪問(wèn)医咨,不用每次都解包
let temp5 : Int! = 5
let temp6 : Int = temp5
if temp5 != nil {
print("隱式解包:\(temp6+8)")
}
對(duì)可選項(xiàng)為空值進(jìn)行解包枫匾,會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)
let num1 :Int! = nil
let num2 :Int = num1
6.多重可選項(xiàng)
6.1空盒子的辨別
var kg : Int? = 10
var kg2 : Int?? = kg
var kg3 : Int?? = 10
print(kg2 == kg3) //true
6.2空盒子的辨別
var mc : Int? = nil
var mc2 : Int?? = mc
var mc3 : Int?? = nil
print(mc2 == mc3) /// false
6.3 lldb命令frame variable -r查看變量的類型
查看mc2的結(jié)構(gòu)
frame variable -R mc2
(Swift.Optional<Swift.Optional<Swift.Int>>) mc2 = some {
some = none {
some = {
_value = 0
}
}
}
查看mc3的結(jié)構(gòu)
frame variable -R mc3
(Swift.Optional<Swift.Optional<Swift.Int>>) mc3 = none {
some = some {
some = {
_value = 0
}
}
}
可以看出mc3 = none,mc3是一個(gè)空盒子拟淮。
some = none代表值為nil的空盒子
some = none {
some = {
_value = 0
}
}