標籤:
- 基礎資料類型
Swift 的類型是在 C 和 Objective-C 的基礎上提出的,Int是整型;Double和Float是浮點型;Bool是布爾型;String是字串。Swift 還有兩個有用的集合類型,Array和Dictionary,請參考集合類型。
Swift 還增加了 Objective-C 中沒有的類型比如元組(Tuple)。元組可以讓你建立或者傳遞一組資料,比如作為函數的傳回值時,你可以用一個元組可以返回多個值。
Swift 還增加了可選(Optional)類型,用於處理值缺失的情況。
- 1.聲明常量和變數
常量和變數必須在使用前聲明,用let來聲明常量,用var來聲明變數。下面的例子展示了如何用常量和變數來記錄使用者嘗試登入的次數:
let maximumNumberOfLoginAttempts = 1
var currentLoginAttempt = 0
- 2.類型標註
當你聲明常量或者變數的時候可以加上類型標註(type annotation),說明常量或者變數中要儲存的值的類型。如果要添加類型標註,需要在常量或者變數名後面加上一個冒號和空格,然後加上類型名稱。
這個例子給welcomeMessage變數添加了類型標註,表示這個變數可以儲存String類型的值
var welcomeMessage: String
注意:一般來說你很少需要寫類型標註。如果你在聲明常量或者變數的時候賦了一個初始值,Swift可以推斷出這個常量或者變數的類型,請參考型別安全和類 型推斷。在上面的例子中,沒有給welcomeMessage賦初始值,所以變數welcomeMessage的類型是通過一個類型標註指定的,而不是通 過初始值推斷的。
- 3.型別安全和類型推測
Swift 是一個型別安全(type safe )的語言。型別安全的語言可以讓你清楚地知道代碼要處理的值的類型。如果你的代碼需要一個String,你絕對不可能不小心傳進去一個Int。
- 4.布爾值
Swift 有一個基本的布爾(Boolean)類型,叫做Bool。布爾值指邏輯上的(logical),因為它們只能是真或者假。Swift 有兩個布爾常量,true和false:
- let orangesAreOrange = true
- let turnipsAreDelicious = false
- 5.元組
元組(tuples)把多個值組合成一個複合值。元組內的值可以使任意類型,並不要求是相同類型。
下面這個例子中,(404, "Not Found")是一個描述 HTTP 狀態代碼(HTTP status code)的元組。HTTP 狀態代碼是當你請求網頁的時候 網頁伺服器返回的一個特殊值。如果你請求的網頁不存在就會返回一個404 Not Found狀態代碼。
- let http404Error = (404, "Not Found")
- // http404Error 的類型是 (Int, String),值是 (404, "Not Found")
(404, "Not Found")元組把一個Int值和一個String值組合起來表示 HTTP 狀態代碼的兩個部分:一個數字和一個人類可讀的描述。這個元組可以被描述為“一個類型為(Int, String)的元組”。
你可以把任意順序的類型組合成一個元組,這個元組可以包含所有類型。只要你想,你可以建立一個類型為(Int, Int, Int)或者(String, Bool)或者其他任何你想要的組合的元組。
你可以將一個元組的內容分解(decompose)成單獨的常量和變數,然後你就可以正常使用它們了:
- let (statusCode, statusMessage) = http404Error
- println("The status code is \(statusCode)")
- // 輸出 "The status code is 404"
- println("The status message is \(statusMessage)")
- // 輸出 "The status message is Not Found"
如果你只需要一部分元組值,分解的時候可以把要忽略的部分用底線(_)標記:
- let (justTheStatusCode, _) = http404Error
- println("The status code is \(justTheStatusCode)")
- // 輸出 "The status code is 404"
此外,你還可以通過下標來訪問元組中的單個元素,下標從零開始:
- println("The status code is \(http404Error.0)")
- // 輸出 "The status code is 404"
- println("The status message is \(http404Error.1)")
- // 輸出 "The status message is Not Found"
你可以在定義元組的時候給單個元素命名:
- let http200Status = (statusCode: 200, description: "OK")
給元組中的元素命名後,你可以通過名字來擷取這些元素的值:
- println("The status code is \(http200Status.statusCode)")
- // 輸出 "The status code is 200"
- println("The status message is \(http200Status.description)")
- // 輸出 "The status message is OK"
- 6.可選
使用可選(optionals)來處理值可能缺失的情況。可選表示:
-有值,等於 x 或者 沒有值
Swift 的String類型有一個叫做toInt的方法,作用是將一個String值轉換成一個Int值。然而,並不是所有的字串都可以轉換成一個整數。字串"123"可以被轉換成數字123,但是字串"hello, world"不行。
下面的例子使用toInt方法來嘗試將一個String轉換成Int:
- let possibleNumber = "123"
- let convertedNumber = possibleNumber.toInt()
- // convertedNumber 被推測為類型 "Int?", 或者類型 "optional Int"
因為toInt方法可能會失敗,所以它返回一個可選的(optional)Int,而不是一個Int。一個可選的Int被寫作Int?而不是 Int。問號暗示包含的值是可選,也就是說可能包含Int值也可能不包含值。(不能包含其他任何值比如Bool值或者String值。只能是Int或者什 麼都沒有。)
if 語句以及強制解析
你可以使用if語句來判斷一個可選是否包含值。如果可選有值,結果是true;如果沒有值,結果是false。
當你確定可選包確實含值之後,你可以在可選的名字後面加一個驚嘆號(!)來擷取值。這個驚歎號表示“我知道這個可選有值,請使用它。”這被稱為可選值的強制解析(forced unwrapping):
斷言
可選可以讓你判斷值是否存在,你可以在代碼中優雅地處理值缺失的情況。然而,在某些情況下,如果值缺失或者值並不滿足特定的條件,你的代碼可能並不需要繼續執行。這時,你可以在你的代碼中觸發一個斷言(assertion)來結束代碼運行並通過調試來找到值缺失的原因。
使用斷言進行調試
斷言會在運行時判斷一個邏輯條件是否為true。從字面意思來說,斷言“斷言”一個條件是否為真。你可以使用斷言來保證在運行其他代碼之前,某些重 要的條件已經被滿足。如果條件判斷為true,代碼運行會繼續進行;如果條件判斷為false,代碼運行停止,你的應用被終止。
如果你的代碼在調試環境下觸發了一個斷言,比如你在 Xcode 中構建並運行一個應用,你可以清楚地看到不合法的狀態發生在哪裡並檢查斷言被觸發時你的應用的狀態。此外,斷言允許你附加一條調試資訊。
你可以使用全域assert函數來寫一個斷言。向assert函數傳入一個結果為true或者false的運算式以及一條資訊,當運算式為false的時候這條資訊會被顯示:
- let age = -3
- assert(age >= 0, "A person‘s age cannot be less than zero")
- // 因為 age < 0,所以斷言會觸發
iOS開發筆記--swift文法基礎