類型別名
類型別名就是給現(xiàn)有類型定義另一個名字,方便我們辨認(rèn),比如一些比較難記的系統(tǒng)類型,就可以使用typealias來定義類型別名
typealias Number = Unit16
//類型別名搞完之后,就可以在之后的任何地方使用
var minNumber = Number.min
//因?yàn)镹umber是Unit16類型的別名,所以,minNumber的最終值應(yīng)該是0
元組
元組是把多個值組合成一個復(fù)合值。元組內(nèi)的值可以是任意類型,并不要求是相同類型,按我粗淺的理解,有點(diǎn)像OC中block的多參傳遞
下面的例子中,personDetail為一個元組
let personDetail = (26,"女","50kg")
let (age, gender, weight) = personDetail
print("age = \(String(age)) \ngender = \(gender) \nweight = \(weight)")
/*
控制臺打印一下,輸出為
age = 26
gender = 女
weight = 50kg
*/
這個元組可以描述為一個類型為(Int,String,String)的元組
元組中的內(nèi)容可以任意分解成單獨(dú)的常量和變量,比如
let (age, gender, weight) = personDetail
print("小姐姐 \(age) 了")
//輸出內(nèi)容 小姐姐 26 了
當(dāng)我們不需要元組中的一些數(shù)據(jù)的時候,我們可以用_來忽略這些數(shù)據(jù),比如
let (age, gender, _) = personDetail
元組元組,當(dāng)然是能通過類似數(shù)組一樣用下標(biāo)的訪問方式訪問元組中的數(shù)據(jù)了,比如
print("小姐姐 \(personDetail.0) 了")
//輸出內(nèi)容 小姐姐 26 了
也可以對元組中的元素進(jìn)行命名,命名之后可以通過名字來獲取
let personDetail = (age:26,gender:"女",weight:"50kg")
print("age = \(String(personDetail.age)) \ngender = \(personDetail.gender) \nweight = \(personDetail.weight)")
/*
輸出內(nèi)容
age = 26
gender = 女
weight = 50kg
*/
這種寫法相當(dāng)于對之前幾種寫法的匯總
可選類型
在Swift中可以使用可選類型來處理值可能確實(shí)的情況,需要注意的是,在C跟OC中,是沒有可選類型這個概念的,最接近的應(yīng)該就是nil了,但是OC中nil用來表示"缺少一個合法的對象",nil大家都知道,只對對象起作用,像結(jié)構(gòu)體,枚舉之類的這種,就GG了,這些類型一般都用NSNotFound來表示沒有正確的值
下面我們來試一下Swift中的可選類型
let age = "26"
let ageNum = Int(age)
上面的例子中Xcode將ageNum推斷為Int?為什么后面帶了一個?呢,問號就是我們上面所說的可選類型,也就是說,ageNum可能有Int值也可能沒有,像age = "26"轉(zhuǎn)換過來肯定是有值的,像age = "小姐姐26了"這種的轉(zhuǎn)換過來肯定是沒有值的
nil
我們可以給可選變量賦值一個nil來表示這個變量沒有值,例如
var age:Int? = 26
//age現(xiàn)在是一個Int值,為26
age = nil
//age現(xiàn)在不包含值
需要注意的是,nil不能用在非可選的常量和變量,如果有常量或者變量需要處理值缺失的情況,需要提前聲明成對應(yīng)的可選類型
var age:Int?
//這個在沒有賦值之前會被自動設(shè)置為nil
Swift中的nil跟OC中的nil不是一回事,Swift中的nil是一個確定的不存在的值,可以用來表示任何類型,而OC中的nil是一個空指針,只能用在對象類型,注意區(qū)分
if語句以及強(qiáng)制解析
敲代碼的時候我們最常用的就是if語句判斷了,Swift中的if判斷跟OC中的if判斷大致相同,我們可以使用if語句和nil比較來判斷一個可選值是否包含值,可以使用==or!=來進(jìn)行比較
if age !=nil {
//do something
}
上面的語句判斷意思就是在age有值的前提下,括號里面來處理對應(yīng)的事件
當(dāng)我們100%確定一個可選值有值的情況下,可以使用強(qiáng)制解析,比如
var age:Int?
age = 26
if age !=nil {
print("小姐姐 \(age!) 了")
}
//輸出內(nèi)容為 小姐姐 26 了
使用強(qiáng)制解析的時候,如果強(qiáng)制解析的值沒有值,會crash,所以,在沒有100%確定有值的情況下,不能使用強(qiáng)制解析
可選綁定
使用可選綁定來判斷可選類型是否包含值,可選綁定用在if或者while語句中,有兩個功能,一是判斷可選類型是否有值,二是將可選類型賦值給一個臨時常量或者變量,比如
let age:String? = "26"
if let ageNum = Int(age!) {
print("小姐姐 \(ageNum) 了")
}else{
print("小姐姐年齡轉(zhuǎn)換錯誤")
}
//最終控制臺輸出為 小姐姐 26 了
上面這個例子中,可選綁定實(shí)現(xiàn)了判斷age是否有值并把age賦值給ageNum兩個功能,可選綁定的判斷意思是當(dāng)age轉(zhuǎn)換為Int類型成功并且有值的時候,語句BOOL值為true否則為false
可選綁定也可以嵌套使用
if let sisterAge = Int("26"), let brotherAge = Int("27"), sisterAge < brotherAge && brotherAge < 30 {
print("\(sisterAge) < \(brotherAge) < 30")
}
//控制臺輸出為 26 < 27 < 30
上面三條if語句,只要有一個不成立,那么整個if語句的判斷即為flase
上面的嵌套寫法也可以寫成下面這樣
if let sisterAge = Int("26") {
if let brotherAge = Int("27") {
if sisterAge < brotherAge && brotherAge < 30 {
print("\(sisterAge) < \(brotherAge) < 30")
}
}
}
最終的輸出結(jié)果是一樣的,只不過下面的這種寫法可以分別在第一層和第二層做相應(yīng)的特殊處理
隱式解析可選類型
上面我們學(xué)習(xí)了可選類型的常量或者變量可以為nil,有時候我們可以確定一個可選類型在被賦值之后是肯定有值的,這時候如果每次去判斷這個可選類型有沒有值,是下下之策,因?yàn)槲覀円呀?jīng)確定了他有值,這時候,隱式解析可選類型就派上用場了
let weight:String? = "50kg"
let realWeight:String = weight!
let gender:String! = "女"
let realGender:String = gender
其實(shí)就相當(dāng)于一個可以自動解析的可選類型,這種方法僅僅適用于在一個變量被賦值之后,可以100%確定他之后一定有值,如果這個值在第一次賦值之后又被多次賦值,而且可能為nil,不能使用隱式解析