Swift從零開始(二)

類型別名


類型別名就是給現(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,不能使用隱式解析

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容