2、基本數(shù)據(jù)類型
這里介紹一下Swift
的基本數(shù)據(jù)類型:整數(shù)、浮點數(shù)、布爾型、可選型和元組,其它較復(fù)雜的后面再介紹。Swift
中的數(shù)據(jù)類型的首字母都是大寫的。
2.1、整數(shù)
整數(shù)的定義為沒有小數(shù)部分的數(shù)字,可以帶有正負(fù)號,Swift
提供了Int
和UInt
兩種整數(shù)類型,分別表示有符號和無符號的整數(shù)類型。在Int
和UInt
后面可以帶有數(shù)字8、16、32和64,以表示8、16、32、64位的整數(shù)。另外,整數(shù)類型都有屬性max
和min
,分別表示不同整數(shù)類型的最大值和最小值,在Swift
中訪問屬性采用“點方法”。
2.2、浮點數(shù)
浮點數(shù)是指有小數(shù)部分的數(shù)字,比如3.1415926。Swift
提供了兩種浮點數(shù)類型:Float
和Double
,Float
表示32位浮點數(shù),而Double
表示64位浮點數(shù),選擇哪種類型的浮點數(shù)取決于你對精度的要求。
2.3、布爾型
Swift
提供了一個非真即假的邏輯類型--布爾類型(Bool
)。布爾類型有兩個常量:true
和false
。需要注意的是,Swift
中的布爾類型不同于OC
中的BOOL
類型,不再接受0代表false
、1代表true
的用法,如下代碼所示。
//正確
if true {
let num = 1
}
//錯誤
if 1 {
let num = 1
}
2.4、元組類型
元組是Swift
中非常好用的一個數(shù)據(jù)類型,它可以把多個值成員復(fù)合成一個值,并且這些成員的數(shù)據(jù)類型可以不同,把成員值放到一個括號中,以逗號分隔。比如一個學(xué)生的身份信息:
let message = ("小傅","18","高三一班")
這個元組類型就可以表達(dá)出一個高三一班名叫小傅的18歲同學(xué),結(jié)構(gòu)非常精簡。元組中的每個成員值都有一個默認(rèn)的索引,我們可以通過索引直接獲取元組中各部分的值,比如:
let name = message.0
let age = message.1
let grage = message.2
在playground
中顯示如圖2.4所示
我們可以自定義每個成員變量的名字,格式為(成員名稱1:成員值1,成員名稱2:成員值2,······),調(diào)用的時候可以使用名稱調(diào)用:
let message2 = (name:"小傅",age:"18",grade:"高三一班")
let name2 = message2.name
let age2 = message2.age
let grade2 = message2.grade
另外,如果想要獲取元組中的某些重要部分加以利用,忽略一些不重要的信息時,可以把元組的值傳遞到一個新的元組中,在新元組中聲明那些接受重要值的值成員,而不重要的使用下劃線“_
”表示忽略。例如上例中,只關(guān)心學(xué)生信息的學(xué)生姓名,那么可以使用下面的語句,元組中的成員可以直接當(dāng)作常量和變量使用:
let (showName,_,_) = message2
print("Name is \(showName)")
2.5、可選型
可選型用于某些不確定是否有值的情況,其有兩個返回值:具體的值和nil
,nil
表示空值。OC
中沒有可選型這種數(shù)據(jù)類型,可選型是Swift
都有的。定義可選型只需在常規(guī)類型后面加一個問號?
即可,例如:
var age : Int?
這樣,age
就被定義成一個可選型,如果它有值,就一定會返回一個Int
類型的值,否則返回nil
。可選型經(jīng)常被用作搜索或者轉(zhuǎn)型方法的返回值類型,這是因為在搜索和轉(zhuǎn)型中經(jīng)常出現(xiàn)失敗的情況。介紹一個轉(zhuǎn)型的例子,在Swift
中,String
類型可以和Int
類型的實例相互轉(zhuǎn)換,你可以把諸如"12"
這樣的字符串轉(zhuǎn)換成Int
,但是不能轉(zhuǎn)換“小明”
這樣的字符串,Swift
風(fēng)格的轉(zhuǎn)型使用構(gòu)造器。如圖2.5所示。
值得注意的是,
age
在定義為Int
類型的可選型之后被賦予了一個默認(rèn)的初始值nil
,這也是可選型的一個好處之一。看一下下面的代碼:
var age : Int?
age = Int("12")
print("age is \(age)")
你可能認(rèn)為代碼第三行應(yīng)該輸出的應(yīng)該是“age is 12”
,但是實際情況并不是這樣,如圖2.6所示。
在輸出語句中我們得到的
age
的值顯示為Optional(12)
,Optional
代表可選,age
的當(dāng)前值為一個整數(shù)類型的可選型。在實際開發(fā)中我們真正需要的是括號中的12
,想要獲取這個12
,就需要使用“解包”
操作。 解包是針對于可選類型的變量操作,當(dāng)我們確定一個可選型的值不為nil
的時候,可以使用解包獲取其中的值。它的表現(xiàn)形式也非常簡單,在需要進(jìn)行解包的變量名后面加上一個感嘆號!
。現(xiàn)在對age
變量進(jìn)行解包,效果如圖2.7所示。
最后需要指出的是,聲明一個可選型雖然可以通過編譯器設(shè)置的安全性檢查,但是如果你不慎忘記在之后對其賦值,那么在解包的時候程序就會崩潰。所以我們在聲明一個對象的時候,尤其是聲明類或者結(jié)構(gòu)體的屬性的時候,應(yīng)該三思而后行,盡可能為其賦初始值,當(dāng)然這個初始值應(yīng)該是明顯區(qū)別于正常值的。再把可選型轉(zhuǎn)換成非可選型的賦值語句中經(jīng)常用到
“??”
操作符,“??”
之前為一個可選型,“??”
之后為一個非可選型的值。“??”
操作符自帶解包功能,在賦值時“??”
會檢查其之前的可選型:如果可選型不為nil
,則將其解包并返回;如果其為nil
,則不會返回nil
,則此時返回“??”
之后的非可選型的值。使用“??”
改造上面的代碼,如下所示:
var age:Int //這里避免解包,聲明age為非可選型
age = Int("12") ?? -1
print("age is \(age)") //轉(zhuǎn)型成功
age = Int("小明") ?? -1
print("age is \(age)") //轉(zhuǎn)型失敗
運行結(jié)果如圖2.8
由于在真實的數(shù)據(jù)環(huán)境中年齡不可能為負(fù)數(shù),此時當(dāng)我們看到
age
為-1的時候就知Int(String)
轉(zhuǎn)型失敗了。Swift
提供了一種更安全的解包方式:可選綁定。可選綁定有兩種格式可選:if-let
和guard-let-else
。首先來看if-let
結(jié)構(gòu):
var age:Int? = Int("12")
if let a = age {
print(a)
}
類似于if
語句,當(dāng)age
不為空的時候,對age
解包并給其一個“別名”a
,在if
后的大括號中對a
才有效果,此時a
的值為12,已經(jīng)解包。如果age
為nil
,那么大括號中的代碼不會執(zhí)行,使用可選解包程序不會崩潰。guard-let-else
是Swift2.2
新引入的格式,示例如下:
var age:Int? = Int("12")
func findA() {
guard let a = age else {
print("終止方法")
return //終止方法
}
print(a) //在外部使用解包后的值
}
不同于if-let
,guard-let-else
首先處理age
為nil
的情況,在此種情況中必須在大括號中使用return
或者break
提前終止代碼。這里不管有多少個guard-let-else
,別名a
的作用域都在最外層,有效地避免了過于深入的嵌套。