The Swift Programming Language (基礎部分)

來源:互聯網
上載者:User

標籤:swift   ios   string   開發經驗   

簡介

Swift 是一門開發 iOS, OS X 和 watchOS 應用的新語言。然而,如果你有 C 或者 Objective-C 開發經驗的話,你會發現 Swift 的很多內容都是你熟悉的。

Swift 包含了 C 和 Objective-C 上所有基礎資料類型,Int表示整型值;Double和Float表示浮點型值;Bool是布爾型值;String是文本型資料。Swift 還提供了三個基本的集合類型,Array,Set和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 = 10var currentLoginAttempt = 0

這兩行代碼可以被理解為:

“聲明一個名字是maximumNumberOfLoginAttempts的新常量,並給它一個值10。然後,聲明一個名字是currentLoginAttempt的變數並將它的值初始化為0.”

在這個例子中,允許的最大嘗試登入次數被聲明為一個常量,因為這個值不會改變。當前嘗試登入次數被聲明為一個變數,因為每次嘗試登入失敗的時候都需要增加這個值。

你可以在一行中聲明多個常量或者多個變數,用逗號隔開:

var x = 0.0, y = 0.0, z = 0.0

注意:
如果你的代碼中有不需要改變的值,請使用let關鍵字將它聲明為常量。只將需要改變的值聲明為變數.

類型標註

當你聲明常量或者變數的時候可以加上類型標註(type annotation),說明常量或者變數中要儲存的值的類型。如果要添加類型標註,需要在常量或者變數名後面加上一個冒號和空格,然後加上類型名稱。

這個例子給welcomeMessage變數添加了類型標註,表示這個變數可以儲存String類型的值:

var welcomeMessage: String

聲明中的冒號代表著“是…類型”,所以這行代碼可以被理解為:
“聲明一個類型為String,名字為welcomeMessage的變數。”
“類型為String”的意思是“可以儲存任意String類型的值。”
welcomeMessage變數現在可以被設定成任一字元串:

welcomeMessage = "Hello"

你可以在一行中定義多個同樣類型的變數,用逗號分割,並在最後一個變數名之後添加類型標註:

var red, green, blue: Double

注意:
一般來說你很少需要寫類型標註。如果你在聲明常量或者變數的時候賦了一個初始值,Swift可以推斷出這個常量或者變數的類型,請參考型別安全和類型推斷。在上面的例子中,沒有給welcomeMessage賦初始值,所以變數welcomeMessage的類型是通過一個類型標註指定的,而不是通過初始值推斷的。

常量和變數的命名

你可以用任何你喜歡的字元作為常量和變數名,包括 Unicode 字元:

let π = 3.14159let 你好 = "你好世界"let ???? = "dogcow"

常量與變數名不能包含數學符號,箭頭,保留的(或者非法的)Unicode 碼位,連線與定位字元。也不能以數字開頭,但是可以在常量與變數名的其他地方包含數字。

一旦你將常量或者變數聲明為確定的類型,你就不能使用相同的名字再次進行聲明,或者改變其儲存的值的類型。同時,你也不能將常量與變數進行互轉。

注意:
如果你需要使用與Swift保留關鍵字相同的名稱作為常量或者變數名,你可以使用反引號(`)將關鍵字包圍的方式將其作為名字使用。無論如何,你應當避免使用關鍵字作為常量或變數名,除非你別無選擇。

你可以更改現有的變數值為其他同類型的值,在下面的例子中,friendlyWelcome的值從”Hello!”改為了”Bonjour!”:

var friendlyWelcome = "Hello!"friendlyWelcome = "Bonjour!"// friendlyWelcome 現在是 "Bonjour!"

與變數不同,常量的值一旦被確定就不能更改了。嘗試這樣做會導致編譯時間報錯:

let languageName = "Swift"languageName = "Swift++"// 這會報編譯時間錯誤 - languageName 不可改變
輸出常量和變數

你可以用print(_:)函數來輸出當前常量或變數的值:

print(friendlyWelcome)// 輸出 "Bonjour!"

print(:)是一個用來輸出的全域函數,輸出的內容會在最後換行。如果你用 Xcode,print(:)將會輸出內容到“console”面板上。(另一種函數叫print(_:appendNewline:),唯一區別是在輸出內容最後不會換行。)

print(_:)函數輸出傳入的String值:

print("This is a string")// 輸出 "This is a string"

print(_:)函數可以輸出更複雜的資訊。這些資訊可以包含當前常量和變數的值。

Swift 用字串插值(string interpolation)的方式把常量名或者變數名當做預留位置加入到長字串中,Swift 會用當前常量或變數的值替換這些預留位置。將常量或變數名放入圓括弧中,並在開括弧前使用反斜線將其轉義:

print("The current value of friendlyWelcome is \(friendlyWelcome)")// 輸出 "The current value of friendlyWelcome is Bonjour!

注意:
字串插值所有可用的選項,請參考字串插值。

注釋

請將你的代碼中的非執行文本注釋成提示或者筆記以方便你將來閱讀。Swift 的編譯器將會在編譯代碼時自動忽略掉注釋部分。

Swift 中的注釋與C 語言的注釋非常相似。單行注釋以雙正斜杠(//)作為起始標記:

// 這是一個注釋

你也可以進行多行注釋,其起始標記為單個正斜杠後跟隨一個星號(/),終止標記為一個星號後跟隨單個正斜杠(/):

/* 這是一個,多行注釋 */

與 C 語言多行注釋不同,Swift 的多行注釋可以嵌套在其它的多行注釋之中。你可以先產生一個多行註解區塊,然後在這個註解區塊之中再嵌套成第二個多行注釋。終止注釋時先插入第二個註解區塊的終止標記,然後再插入第一個註解區塊的終止標記:

/* 這是第一個多行注釋的開頭/* 這是第二個被嵌套的多行注釋 */這是第一個多行注釋的結尾 */

通過運用嵌套多行注釋,你可以快速方便的注釋掉一大段代碼,即使這段代碼之中已經含有了多行註解區塊。

分號

與其他大部分程式設計語言不同,Swift 並不強制要求你在每條語句的結尾處使用分號(;),當然,你也可以按照你自己的習慣添加分號。有一種情況下必須要用分號,即你打算在同一行內寫多條獨立的語句:

let cat = "??"; print(cat)// 輸出 "??"
整數

整數就是沒有小數部分的數字,比如42和-23。整數可以是有符號(正、負、零)或者無符號(正、零)。

Swift 提供了8,16,32和64位的有符號和不帶正負號的整數類型。這些整數類型和 C 語言的命名方式很像,比如8位不帶正負號的整數類型是UInt8,32位有符號整數類型是Int32。就像 Swift 的其他類型一樣,整數類型採用大寫命名法。

整數範圍

你可以訪問不同整數類型的min和max屬性來擷取對應類型的最大值和最小值:

let minValue = UInt8.min  // minValue 為 0,是 UInt8 類型let maxValue = UInt8.max  // maxValue 為 255,是 UInt8 類型

min和max所傳回值的類型,正是其所對的整數類型(如上例UInt8, 所傳回的類型是UInt8),可用在運算式中相同類型值旁。

Int

一般來說,你不需要專門指定整數的長度。Swift 提供了一個特殊的整數類型Int,長度與當前平台的原生字長相同:

  • 在32位平台上,Int和Int32長度相同。
  • 在64位平台上,Int和Int64長度相同。

除非你需要特定長度的整數,一般來說使用Int就夠了。這可以提高代碼一致性和可複用性。即使是在32位平台上,Int可以儲存的整數範圍也可以達到-2147483648~2147483647,大多數時候這已經足夠大了。

UInt

Swift 也提供了一個特殊的無符號類型UInt,長度與當前平台的原生字長相同:

  • 在32位平台上,UInt和UInt32長度相同。
  • 在64位平台上,UInt和UInt64長度相同。

注意:
盡量不要使用UInt,除非你真的需要儲存一個和當前平台原生字長相同的不帶正負號的整數。除了這種情況,最好使用Int,即使你要儲存的值已知是非負的。統一使用Int可以提高代碼的可複用性,避免不同類型數字之間的轉換,並且匹配數位類型推斷,請參考型別安全和類型推斷。

浮點數

浮點數是有小數部分的數字,比如3.14159,0.1和-273.15。

浮點類型比整數類型表示的範圍更大,可以儲存比Int類型更大或者更小的數字。Swift 提供了兩種有符號浮點數類型:

  • Double表示64位浮點數。當你需要儲存很大或者很高精度的浮點數時請使用此類型。
  • Float表示32位浮點數。精度要求不高的話可以使用此類型。

注意:
Double精確度很高,至少有15位元字,而Float最少只有6位元字。選擇哪個類型取決於你的代碼需要處理的值的範圍。

型別安全和類型推斷

Swift 是一個型別安全(type safe)的語言。型別安全的語言可以讓你清楚地知道代碼要處理的值的類型。如果你的代碼需要一個String,你絕對不可能不小心傳進去一個Int。

由於 Swift 是型別安全的,所以它會在編譯你的代碼時進行類型檢查(type checks),並把不匹配的類型標記為錯誤。這可以讓你在開發的時候儘早發現並修複錯誤。

當你要處理不同類型的值時,類型檢查可以幫你避免錯誤。然而,這並不是說你每次聲明常量和變數的時候都需要顯式指定類型。如果你沒有顯式指定類型,Swift 會使用_類型推斷(type inference)來選擇合適的類型。有了類型推斷,編譯器可以在編譯代碼的時候自動推斷出運算式的類型。原理很簡單,只要檢查你賦的值即可。

因為有類型推斷,和 C 或者 Objective-C 比起來 Swift 很少需要宣告類型。常量和變數雖然需要明確類型,但是大部分工作並不需要你自己來完成。

當你聲明常量或者變數並賦初值的時候類型推斷非常有用。當你在聲明常量或者變數的時候賦給它們一個字面量(literal value 或 literal)即可觸發類型推斷。(字面量就是會直接出現在你代碼中的值,比如42和3.14159。)

例如,如果你給一個新常量賦值42並且沒有標明類型,Swift 可以推斷出常量類型是Int,因為你給它賦的初始值看起來像一個整數:

let meaningOfLife = 42// meaningOfLife 會被推測為 Int 類型

同理,如果你沒有給浮點字面量標明類型,Swift 會推斷你想要的是Double:

let pi = 3.14159// pi 會被推測為 Double 類型

當推斷浮點數的類型時,Swift 總是會選擇Double而不是Float。

如果運算式中同時出現了整數和浮點數,會被推斷為Double類型:

let anotherPi = 3 + 0.14159// anotherPi 會被推測為 Double 類型

原始值3沒有顯式宣告類型,而運算式中出現了一個浮點字面量,所以運算式會被推斷為Double類型。

未完待續!

參考資料:

The Swift Programming Language 中文版

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

The Swift Programming Language (基礎部分)

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.