類型
基本類型
- Int
- Double
- Float
- Character
- String
- Bool
- SubString
集合類型
- Array
- Set
- Dictionary
高級(jí)類型
- tuple
- 區(qū)間類型
- 可選類型
- Any
...
Swifi是一種類型安全的語言
定義變量
- 常量使用
let - 變量使用
var
類型注釋
使用類型注釋來告知被存儲(chǔ)的變量(常量)是什么類型
var welcomeMessage:String
整型邊界
let minValue = UInt8.min //minValue的值為0 ,這是8位無符號(hào)數(shù)的最小值
let maxValue = UInt8.max // maxValue為255
類型安全和類型推測
Swift是類型安全的語言,不允許隱式類型轉(zhuǎn)換.
數(shù)字進(jìn)制
- 十進(jìn)制數(shù)字,沒有前綴
- 二進(jìn)制數(shù)字,前綴
0b - 八進(jìn)制數(shù)字,前綴
0o - 十六進(jìn)制數(shù)字,前綴
0x
使用科學(xué)計(jì)數(shù)法
- 十進(jìn)制:1.25e2 表示
- 十六進(jìn)制: 0xFp2 表示
,即十進(jìn)制數(shù)60
分隔符
可以使用_用作數(shù)字的分隔符
let oneMillion = 1_000_000
類型別名
使用關(guān)鍵字typealias定義類型別名
typealias AudioSample = UInt16
可選類型
在值可能為空的地方使用可選類型
可選類型表示兩種可能:有值或者為空
在C語言和OC中沒有可選類型的概念,在Objective-C中最接近可選類型的是使用一個(gè)nil來表示一個(gè)對(duì)象,但是Objective-C中的nil只能表示對(duì)象,不能表示基本類型
下面有個(gè)例子來演示可選類型如何應(yīng)對(duì)缺失值
將一個(gè)string轉(zhuǎn)化成int 如果是''123''就沒有問題,但是如果是"Hello"這樣的值就沒有辦法
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// covertedNumber 被推斷為是"Int?"類型的
因?yàn)橘x值轉(zhuǎn)化可能會(huì)失敗,所以返回的是可選類型
nil
可以給可選類型賦值為nil代表空
注意:不能吧nil賦值給非可選類型變量,如果一個(gè)變量可能為空,在定義的時(shí)候,使用可選類型
如果在定義可選類型的時(shí)候沒有使用默認(rèn)值,那么這個(gè)值就會(huì)被置為nil
swift中的
nil和Objective-C中的nil不同,Objective-C中的nil只能表示不存在的對(duì)象.在Swift中nil不是表示一個(gè)指針.是表示可選類型具體值的缺失
可選綁定
使用可選綁定確定一個(gè)可選類型的值是否有值.如果有值,將值賦予一個(gè)常量,該常量的類型是可選類型非空的值的類型
if let constantName = someOptional {
statements
}
隱式解析可選類型
如上所述,可選暗示了常量或者變量可以“沒有值”??蛇x可以通過if語句來判斷是否有值,如果有值的話可以通過可選綁定來解析值。
有時(shí)候在程序中,第一次被賦值之后,可以確定一個(gè)可選總會(huì)有值。在這種情況下,每次都要判斷和解析可選值是非常低效的,因?yàn)榭梢源_定它總會(huì)有值。
這種類型的可選被定義為隱式解析可選(implicitly unwrapped optionals)。把想要用作可選的類型的后面的問號(hào)(String?)改成感嘆號(hào)(String!)來聲明一個(gè)隱式解析可選。
當(dāng)可選被第一次賦值之后就可以確定之后一直有值的時(shí)候,隱式解析可選非常有用
let possibleString: String? ="An optional string."
println(possibleString!)// 需要驚嘆號(hào)來獲取值
也就是說,在可選類型后面使用!之后,可選類型的值就被強(qiáng)制取出來了,而不用進(jìn)行顯式的可選綁定操作.當(dāng)你十分確定一個(gè)可選類型有值的時(shí)候,使用這個(gè)方法
異常處理
在程序執(zhí)行階段,你可以使用錯(cuò)誤處理機(jī)制來為錯(cuò)誤狀況負(fù)責(zé)。
相比于可選項(xiàng)的通過值是否缺失來判斷程序的執(zhí)行正確與否,而錯(cuò)誤處理機(jī)制能允許你判斷錯(cuò)誤的形成原因,在必要的情況下,還能將你的代碼中的錯(cuò)誤傳遞到程序的其他地方。
通過在函數(shù)聲明過程當(dāng)中加入 throws 關(guān)鍵字來表明這個(gè)函數(shù)會(huì)拋出一個(gè)錯(cuò)誤。當(dāng)你調(diào)用了一個(gè)可以拋出錯(cuò)誤的函數(shù)時(shí),需要在表達(dá)式前預(yù)置 try 關(guān)鍵字.
func canThrowAnError() throws {
// this function may or may not throw an error
}
Swift 會(huì)自動(dòng)將錯(cuò)誤傳遞到它們的生效范圍之外,直到它們被 catch 分句處理。
do{
try canThrowAnError()
//無異常拋出
} catch{
//異常拋出
}
斷言和先決條件
使用assert(_:_:)函數(shù)來寫斷言,當(dāng)該函數(shù)的第一個(gè)參數(shù)為false時(shí),斷言被觸發(fā),程序終止,顯示第二個(gè)參數(shù)的信息
let age = -3
assert(age >= 0,"年齡不能小于0")
斷言信息也可以省略
assert(age >= 0)
如果代碼已經(jīng)進(jìn)行了條件檢查,那么可以使用assertionFailure(_:file:line:)來標(biāo)明斷言失敗
if(age >=0 ){
}else {
assertionFailure("年齡不能小于0")
}
強(qiáng)制先決條件
在你代碼中任何條件可能潛在為假但必須肯定為真才能繼續(xù)執(zhí)行的地方使用先決條件。比如說,使用先決條件來檢測下標(biāo)沒有越界,或者檢測函數(shù)是否收到了一個(gè)合法的值。
你可以通過調(diào)用 precondition(::file:line:) 函數(shù)來寫先決條件。給這個(gè)函數(shù)傳入表達(dá)式計(jì)算為 true 或false ,如果條件的結(jié)果是 false 信息就會(huì)顯示出來。比如說:
precondition(index >0,"下標(biāo)必須大于0")
你可以調(diào)用 preconditionFailure(_:file:line:) 函數(shù)來標(biāo)明錯(cuò)誤發(fā)生了——比如說,如果 switch 的默認(rèn)情況被選中,但所有的合法輸入數(shù)據(jù)應(yīng)該被其他 switch 的情況處理。
斷言和先決條件的區(qū)別
從語言設(shè)計(jì)層面來說,這兩個(gè)函數(shù)扮演不同的角色:
assert:檢查內(nèi)部的錯(cuò)誤代碼。
precondition:檢查客戶端給你的參數(shù)是否有效。
兩者的區(qū)別很大,第二個(gè)要求有公共文檔,第一個(gè)不需要。
例如:在 Swift 的標(biāo)準(zhǔn)庫中,我們保證永遠(yuǎn)不會(huì)出現(xiàn)內(nèi)存錯(cuò)誤,除非你調(diào)用 (Obj)C 代碼或者使用一個(gè)明確地標(biāo)著「unsafe」的結(jié)構(gòu)。我們需要去檢驗(yàn)客戶端參數(shù),為了避免給了非法的參數(shù)引起內(nèi)存泄露,我們要在參數(shù)中文檔化這些需求作為前置條件,并且使用(等價(jià)的)precondition() 去檢驗(yàn)它。我們還有一系列的內(nèi)部合理檢查,用以確定我們代碼假定的正確性,而類型系統(tǒng)還不能保證這個(gè)代碼的假定。由于這些原因,我們使用(等價(jià)的)assert(),因?yàn)槲覀儾幌虢档湍愕拇a性能(使用合理的檢查)。