什么是可選類型
Swift 定義后綴 ? 來作為標(biāo)準(zhǔn)庫中的定義的命名型類型 Optional<Wrapped> 的語法糖。
換句話說粥庄,下面兩個(gè)聲明是等價(jià)的:
var optionalInteger: Int?
var optionalInteger: Optional<Int>
在上述兩種情況下丧失,變量 optionalInteger 都被聲明為可選整型類型。注意在類型和 ? 之間沒有空格惜互。
為什么產(chǎn)生可選類型
Swift 的 Int 類型有一種構(gòu)造器布讹,作用是將一個(gè) String 值轉(zhuǎn)換成一個(gè) Int 值。然而训堆,并不是所有的字符串都可以轉(zhuǎn)換成一個(gè)整數(shù)描验。字符串 "123" 可以被轉(zhuǎn)換成數(shù)字 123 ,但是字符串 "hello, world" 不行坑鱼。
下面的例子使用這種構(gòu)造器來嘗試將一個(gè) String 轉(zhuǎn)換成 Int:
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推測(cè)為類型 "Int?"膘流, 或者類型 "optional Int"
因?yàn)樵摌?gòu)造器可能會(huì)失敗,所以它返回一個(gè)可選類型(optional)Int姑躲,而不是一個(gè) Int睡扬。一個(gè)可選的 Int 被寫作 Int? 而不是 Int。問號(hào)暗示包含的值是可選類型黍析,也就是說可能包含 Int 值也可能不包含值卖怜。(不能包含其他任何值比如 Bool 值或者 String 值。只能是 Int 或者什么都沒有阐枣。)
定義可選類型
如何證明可選類型也是一種類型马靠?
可選類型有這樣一個(gè)特點(diǎn):可以賦值為nil。在swift中的nil 不等同于OC里的nil蔼两,swift中的nil就是一個(gè)特殊含義的字符甩鳄。表示沒有值《罨可選代表的含義是可能有值妙啃,也可能沒有值。
非可選,代表無論在什么時(shí)候揖赴,在哪里 都有值馆匿。舉個(gè)例子:
var serverResponseCode: Int? = 404
// serverResponseCode 包含一個(gè)可選的 Int 值 404
serverResponseCode = nil
// serverResponseCode 現(xiàn)在不包含值
let num:Optional<Int> = 2
print(num as Any)
// num + = 2//不允許 類型不匹配
print(num as Any)
let num2:Int? = 3
print(num2 as Any)
可選類型的使用
- 賦值操作
//賦值操作
var n: Int? = 0
n = 1
print(n!)
//! 含義 代表 強(qiáng)制解包
//? 代表可選類型 (包裝了其他類型)如果想解包 必須取出其中的其他類型
//n! 代表強(qiáng)制從麻袋里面取東西出來 要求:肯定可以拿到東西
let m = n! + 1
print (m)
//上面的n!不是肯定有值的 因?yàn)榭蛇x類型是可以為nil的
- 取值操作
//如果以后想要使用可選類型的值 應(yīng)該怎么做
//1、第一種寫法
var num:Int? = 0
num = nil
num = 2
if num != nil{
print(num! + 1)
}
這里我們需要對(duì)可選類型的值進(jìn)行非空判斷燥滑。然后才能使用它渐北。
//第二種寫法 可選綁定
//首先判斷 num 是否為nil 如果是 那么if 后面的值 = false
// 如果 num !=nil if 后面的值 = true 還會(huì)把num 強(qiáng)制解包 把解包后的值 賦值給result
if let result = num {
print (result + 1)
}
//第三種寫法
var score: Int? = 0
guard let s = score else {
print("為空")
return
}
print(s + 1)
//第四種寫法
var score: Int? = 0
if score == nil {
print("為空")
return
}
print(score + 1)
真實(shí)使用場(chǎng)景
真實(shí)的使用會(huì)在以后的文章中詳細(xì)闡述。