一.基礎語法:
Swift 是 iOS 和 OS X 應用開發的一門新語言。然而,如果你有 C 或者 Objective-C 開發經驗的話,你會發現 Swift 的很多內容都是你熟悉的。
Swift 的類型是在 C 和 Objective-C 的基礎上提出的,Int是整型;Double和Float是浮點型;Bool是布爾型;String是字符串。Swift 還有兩個有用的集合類型,Array和Dictionary,請參考集合類型。
就像 C 語言一樣,Swift 使用變量來進行存儲并通過變量名來關聯值。在 Swift 中,值不可變的變量有著廣泛的應用,它們就是常量,而且比 C 語言的常量更強大。在 Swift 中,如果你要處理的值不需要改變,那使用常量可以讓你的代碼更加安全并且更好地表達你的意圖。
除了我們熟悉的類型,Swift 還增加了 Objective-C 中沒有的類型比如元組(Tuple)。元組可以讓你創建或者傳遞一組數據,比如作為函數的返回值時,你可以用一個元組可以返回多個值。
Swift 還增加了可選(Optional)類型,用于處理值缺失的情況。可選表示“那兒有一個值,并且它等于 x ”或者“那兒沒有值”。可選有點像在 Objective-C 中使用nil,但是它可以用在任何類型上,不僅僅是類。可選類型比 Objective-C 中的nil指針更加安全也更具表現力,它是 Swift 許多強大特性的重要組成部分。
Swift 是一個類型安全的語言,可選就是一個很好的例子。Swift 可以讓你清楚地知道值的類型。如果你的代碼期望得到一個String,類型安全會阻止你不小心傳入一個Int。你可以在開發階段盡早發現并修正錯誤。
變量和常量:
常量和變量把一個名字(比如maximumNumberOfLoginAttempts或者welcomeMessage)和一個指定類型的值(比如數字10或者字符串"Hello")關聯起來。常量的值一旦設定就不能改變,而變量的值可以隨意更改。
聲明常量和變量:
常量和變量必須在使用前聲明,用let來聲明常量,用var來聲明變量。下面的例子展示了如何用常量和變量來記錄用戶嘗試登錄的次數:
let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0
數值型字面量:
整數字面量可以被寫作:
一個十進制數,沒有前綴
一個二進制數,前綴是0b
一個八進制數,前綴是0o
一個十六進制數,前綴是0x
下面的所有整數字面量的十進制值都是17:
let decimalInteger = 17
let binaryInteger = 0b10001 // 二進制的17
let octalInteger = 0o21 // 八進制的17
let hexadecimalInteger = 0x11 // 十六進制的17
浮點字面量可以是十進制(沒有前綴)或者是十六進制(前綴是0x)。小數點兩邊必須有至少一個十進制數字(或者是十六進制的數字)。浮點字面量還有一個可選的指數(exponent),在十進制浮點數中通過大寫或者小寫的e來指定,在十六進制浮點數中通過大寫或者小寫的p來指定。
如果一個十進制數的指數為exp,那這個數相當于基數和$10^{exp}$的乘積:
1.25e2?表示 $1.25 × 10^{2}$,等于?125.0。
1.25e-2?表示 $1.25 × 10^{-2}$,等于?0.0125。
如果一個十六進制數的指數為exp,那這個數相當于基數和$2^{exp}$的乘積:
0xFp2?表示 $15 × 2^{2}$,等于?60.0。
0xFp-2?表示 $15 × 2^{-2}$,等于?3.75。
下面的這些浮點字面量都等于十進制的12.1875:
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0
數值類字面量可以包括額外的格式來增強可讀性。整數和浮點數都可以添加額外的零并且包含下劃線,并不會影響字面量:
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
元組
元組(tuples)把多個值組合成一個復合值。元組內的值可以使任意類型,并不要求是相同類型。
下面這個例子中,(404, "Not Found")是一個描述?HTTP 狀態碼(HTTP status code)的元組。HTTP 狀態碼是當你請求網頁的時候 web 服務器返回的一個特殊值。如果你請求的網頁不存在就會返回一個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"
作為函數返回值時,元組非常有用。一個用來獲取網頁的函數可能會返回一個(Int, String)元組來描述是否獲取成功。和只能返回一個類型的值比較起來,一個包含兩個不同類型值的元組可以讓函數的返回信息更有用。請參考[函數參數與返回值(06_Functions.html#Function_Parameters_and_Return_Values)。
注意:元組在臨時組織值的時候很有用,但是并不適合創建復雜的數據結構。如果你的數據結構并不是臨時使用,請使用類或者結構體而不是元組。請參考類和結構體。