Swift4基礎(chǔ)內(nèi)容

類型

基本類型

  • 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 表示 1.25\times10^2
  • 十六進(jìn)制: 0xFp2 表示 15\times2^2 ,即十進(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性能(使用合理的檢查)。

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

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

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