Swift學習筆記四

來源:互聯網
上載者:User

標籤:

前面三篇筆記通過一些樣本展示了Swift的一些特性,粗略地介紹了它的文法和特色,從這一篇筆記開始,將正式系統地介紹Swift的文法和特性了。

Swift是一門為iOS和OSX開發準備的全新語言,但是它和C以及Objective-C有很多相似的地方。

Swift給所有的C語言基本類型和Objective-C類型提供了自己的封裝類型,比如用Int標識integers,用Double和Float標識浮點值,String標識文本資料,Swift也提供兩個主要的集合類型提供了自己的版本:Array和Dictionary。

和C一樣,Swift通過唯一的名稱來使用變數儲存和引用值,Swift也大量運用了不可改變的值,即所謂常量,不過比C語言中的常量更為強大。常量的運用貫穿了Swift,使得代碼更安全,更簡潔。

除了那些熟悉的類型,Swift也增加了之前沒有出現的新類型,比如元組(tuple),元組可以讓你建立和傳遞成組的值,可以用元組將很多值作為一個複合值從函數返回。

Swift也引入了可選類型(optional type),用來處理那些可能不存在的值。它就以為著“這裡有一個值,它等於x”或者“這裡沒有這個值”

可選類型和OC中的nil相似,不過它適用於任何類型,而不僅僅是類對象。它也更安全,很多Swif的核心特性的實現都用到了它。

可選類型是Swif是一種型別安全語言的例證,如果你指定某個變數的類型為String,那麼你就不能給它賦Int類型的值了。

 

常量和變數

前面已經介紹過常量和變數了,編寫Swift代碼時,如果確定某個變數的值不會再更改,應該儘可能用let來將其聲明為常量。常量和變數的名稱可以幾乎是任何字元,比如

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

當然,名稱還是會有一些約束,比如不能有箭頭、橫線、數學符號、空格,也不能以數字開頭等。

聲明變數或者常量之後,就不能在用同樣的名字聲明了,也不能將常量轉換成變數,或者反過來。

如果要用Swift語言用過的名字聲明變數,用(`)符號將關鍵字包起來,當然這是不推薦的,除非萬不得已。

型別宣告

可以顯示地指明變數或者常量的類型名稱告訴編譯器這個變數的類型。不過在實際開發中,很少需要這樣宣告類型,因為只要在聲明變數或者常量的時候給它賦初始值,編譯器就能推測出該變數或常量的資料類型了。如果沒有提供初始值,則需要指明變數類型。

分號

在Swift中,並不要求在每一句結尾時加上分號,當然加上分號也不會報錯,但是,如果是在一行裡邊有多個運算式,則在每個運算式後面必須加上分號。

整型(Integers)

Swift提供8、16、32和64位的有符號和無符號整型,它們和C語言類似,比如8位無符號整型為UInt8,整型的範圍可以通過屬性擷取,比如:

let minValue = UInt8.min  // minValue is equal to 0, and is of type UInt8let maxValue = UInt8.max  // maxValue is equal to 255, and is of type UInt8

通常情況下,不要這樣寫,Swift提供了通用的整數型別Int,它為根據實際運行平台調整範圍。與之類似的是UInt,適應平台的無符號整型。

整型變數可以用多種進位表示,十進位則直接書寫,二進位需要加0b首碼,八進位需要加0o首碼,十六進位需要加0x首碼

浮點數

浮點數用來儲存帶有小數點的數,浮點數儲存的範圍比整型要大得多,Swift提供兩種浮點數類型:

Double代表64位的浮點數

Float代表32位的浮點數

Double可以精確到小數點後15位,Float只有6位。根據實際使用方式選擇其中一種使用,如果兩種都適合,推薦使用Double。

浮點數可以用十進位(無首碼)和十六進位(0x首碼)表示,小數點兩邊必須都有數字。也可以用指數表達(十進位用e,十六進位用p):

1.25e2 相當於 1.25 × 100, 或者 125.0  十進位的科學運算式中,基數是10

0xFp2 相當於 15 × 4, 或者 60.0  十六進位的科學運算式中,基數是2

 

數值的字面形式可以有很多格式,前面可以加任意數的縮排或者0,或者加底線,這些都不會對整型和浮點型產生影響。

不同的數實值型別有不同的儲存範圍(比如Int8儲存-128到127,UInt8儲存0到255),將範圍之外的值賦給該變數編譯器會報錯,數實值型別不會隱式地自動轉換,你必須顯示地轉換他們的類型(通過初始化器):

let twoThousand: UInt16 = 2_000let one: UInt8 = 1let twoThousandAndOne = twoThousand + UInt16(one) //這裡本身UInt16和UInt8是不能相加的

整型和浮點型之間的類型轉換也必須顯示地指明,從整型到浮點型以及從浮點型到整型都需要。

 

類型別名

通過typealias關鍵字來為已經存在的類型定義新的名字。

typealias AudioSample = UInt16

一點定義了別名,就可以像用原始類型名一樣在任何地方使用它了

 

Booleans

Swift有一個基礎的布爾類型,叫Bool,並且提供了兩個布爾型常量true和false。

Swift的型別安全機制阻止將非布爾型值向布爾型做隱性轉換,比如:

let i = 1if i { //改成 if i==1 則可    // this example will not compile, and will report an error}

 

元組

元組將多個值組合成一個複合值,這些值並不需要都是統一類型的。比如(404, "Not Found")就可以。

元組也可以被分解為任意的常量或變數,這些變數或常量可以像通常那樣被訪問:

let http404Error = (404, "Not Found")let (statusCode, statusMessage) = http404Errorprintln("The status code is \(statusCode)")// prints "The status code is 404"println("The status message is \(statusMessage)")// prints "The status message is Not Found

如果只需要元組的某一部分值,其他部分可以被忽略的話,那麼在分解元組的時候可以用底線:

let (justTheStatusCode, _) = http404Errorprintln("The status code is \(justTheStatusCode)")// prints "The status code is 404

同時,也可以通過數字序號來訪問元組的成員值:

println("The status code is \(http404Error.0)")// prints "The status code is 404"println("The status message is \(http404Error.1)")// prints "The status message is Not Found

在定義元組時,也可以為每個元素指定名字,此後就可以通過名字來訪問這些元素了:

let http200Status = (statusCode: 200, description: "OK")println("The status code is \(http200Status.statusCode)")// prints "The status code is 200"println("The status message is \(http200Status.description)")// prints "The status message is OK

元組在臨時組織資料的時候非常有用,而不用每次都建立複雜的進階資料結構。但是如果資料需要長久或者複雜地組織起來,用類或者結構更合適。

 

可選項(Optionals)

在C和OC中並沒有可選項,與其最接近的就是OC中函數可以返回一個對象或者nil,nil意味著不存在這個對象。但是nil只對對象適用,C語言基本類型以及OC其他類型都不適用。對於其他類型,OC一般在需要的時候都返回特殊的值(比如NSNotFound),這也以為這函數必須知道應該返回的類型,Swift則沒有這個要求,可選項適用於任何類型。

舉個栗子:Swift中的String類型有一個toInt方法,用來將String轉換為Int,但是並不是所有的String都可以轉換為Int的:

let possibleNumber = "123"let convertedNumber = possibleNumber.toInt()// convertedNumber is inferred to be of type "Int?", or "optional Int"

nil

將optionals的值設為nil表示這個值不存在。

注意:nil並不能用來給非可選項賦值。如果常量或者變數可能會在某些情況下沒有值,則將其設為可選項。可選項值在聲明時如果沒有賦初始值,則自動被設為nil

Swift的nil和OC中的nil不一樣,OC中的nil表示指向不存在的對象的指標,而Swift的nil不是指標,它只是代表某個類型的值不存在。

可以通過是否與nil相等來判斷可選項值是否存在。比如:if convertedNumber != nil 這樣。

如果你確定某個optionals值一定有值,可以通過在optionals值名稱後面加上驚嘆號來訪問其實際值,這就是optionals值的強制展開:

if convertedNumber != nil {    println("convertedNumber has an integer value of \(convertedNumber!).")}// prints "convertedNumber has an integer value of 123.”

注意:如果optionals值不存在,而又通過強制展開訪問它的值,會觸發執行階段錯誤。

 

可選綁定(Optional binding)

通過可選綁定,來確定某個可選項是否有值,如果有,則將其賦給某個臨時常量或者變數,一般通過if和while來實現:

if let constantName = someOptional {    statements}

if let actualNumber = possibleNumber.toInt() { //這裡不僅判斷了是否可以toInt,而且如果成功,就已經將其賦值給常量actualNumber了
  println("\‘\(possibleNumber)\‘ has an integer value of \(actualNumber)")
} else {
  println("\‘\(possibleNumber)\‘ could not be converted to an integer")
}

可選綁定既可以是常量,也可以是變數,並且在一個If運算式中可以有多個可選綁定。

 

隱式展開可選項(implicitly unwrapped optionals)

如前所述,optionals意味著某個常量或者變數允許“沒有值”,並且可以通過if語句來判斷是否含有值,然後有條件地展開。有的時候,通過代碼的結構,可以確定optionals在擁有某個值之後就一直保持存在值的。這時,就不需要在每次擷取它的值時都判斷是否有值而有條件展開,這種optionals被稱為隱式展開可選項,在書寫的時候,在類型後邊加上一個驚嘆號(如:String!)而非問號(如:String?)。

隱式展開的optionals在其初次定義之後就確認有值,並且在之後可以確定一直有值的時候非常有用。它的主要作用在Swift中是在類的初始化中,後面會有介紹。

隱式展開的optionals本質上仍然是個optionals,但是可以像不可選項值(nonoptional value)一樣被使用,而不需要在每次擷取值時都展開。以下樣本展示了在擷取值時可選string和隱式展開可選string的區別:

let possibleString: String? = "An optional string."let forcedString: String = possibleString! // 需要驚嘆號 let assumedString: String! = "An implicitly unwrapped optional string."let implicitString: String = assumedString // 不需要驚嘆號

可以認為隱式展開的optionals是被允許在使用的時候自動延伸的optionals。不是在每次使用的時候在其後邊加上一個驚嘆號,而是在聲明它的時候就在類型名後邊加上一個驚嘆號。

如果訪問一個沒有值的隱式展開optional,會觸發一個執行階段錯誤,這和訪問沒有值的普通optional一樣。

在不確定其後它的值是否會變為nil時,不要用implicitly unwrapped optionals,一般情況下都直接用optional。

 

斷言

可選項是用來檢查一個值是否真的存在,以便做出相應處理,有時,在某個值不存在的時候,程式沒有辦法繼續進行下去,此時可以用斷言來中斷程式,從而可以進行debug。

斷言是一個運行時的檢查,斷言首先設定某個條件,如果運行時條件滿足,則正常運行,如果條件不滿足,則程式中斷,應用被終止。如果實在偵錯模式,此時可以精確知道程式的狀態和中斷位置。

通過全域函數assert來編寫斷言:

let age = -3assert(age >= 0, "A person‘s age cannot be less than zero")//後邊這條描述語句可以被省略// this causes the assertion to trigger, because age is not >= 0

斷言會導致應用被終止,它不是儘可能避免出現錯誤的方式,它是在錯誤很有可能出現的地方,在正式發布之前的開發階段就確保這些錯誤會被發現並且被明確鎖定。

Swift學習筆記四

相關文章

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.