天天看點

3.Swift翻譯教程系列——Swift基礎知識

Swift是用來開發iOS和OS X應用的新語言,可是很多地方用起來跟C或者OC是差點兒相同的。

Swift提供了C語言和OC的基本資料類型,比方整型用Int,浮點型用Double或者Float,布爾型用Bool,字元串文本用String。Swift還提供了兩種集合類型。Array和Dictionary,後面會介紹。

Swift也跟C一樣用唯一的變量名來存儲與使用資料,還能使用一些值不會變的變量,應該說是常量,比C裡面的常量要強大。在涉及到一些值不會發生變化的資料時使用常量類型能讓代碼更安全整潔。

除了跟C和OC相似的類型之外,Swift還添加了一些OC中沒有的類型。比方元組,使用元組能夠建立或者傳遞多個值。函數傳回值使用元組就能夠傳回多個值了。

Swift還添加了可選類型。

可選類型的變量要麼有個确切值,要麼是沒有值。

有點兒像OC裡面值為nil的指針。可是OC裡面指針僅僅能用于對象,Swift可選類型能用于不論什麼資料類型。

可選類型比OC中的nil指針更安全更好用,Swift非常多核心牛逼的特性都要指望他。

可選類型也能說明了Swift是一種類型安全的語言。Swift能讓程式猿清楚知道自己使用的是什麼類型。

假設代碼中須要一個String對象,類型安全機制能夠保證Int之類的非String類型對象被傳過來。

類型安全機制能讓你在寫代碼的時候就能發現并糾正一些錯誤。

1.常量和變量

常量跟變量都由名稱跟值組成,常量的值一旦設定就不同意再改變。變量就沒有這個限制了。僅僅要類型沒錯就能為所欲為。

常量和變量的聲明

常量和變量在使用之前都必須聲明。常量用let聲明,變量用var聲明。這邊有個樣例用常量和變量來記錄使用者嘗試登入次數。

這兩行代碼能夠這樣翻譯:“聲明一個叫做maximumNumberOfLoginAttempts的常量,給他指派為10,然後聲明一個叫currentLoginAttempt的變量,給他指派為0。”

這個樣例裡面maximumNumberOfLoginAttempts是被聲明為常量的,由于最多同意登入嘗試次數是固定的。不會變的。

而currentLoginAttempt表示使用者目前已經嘗試的次數。是随着使用者登入嘗試要添加的,是以要被定義成變量。

聲明變量或者常量的時候也能夠一行聲明多個。中間用逗号分隔。

比方 var x = 0.0, y = 0.0, z = 0.0

NOTE 假設代碼裡面要用到不會改變的值。盡量都用let聲明成常量,僅僅有須要改變的才聲明成變量。

類型标注

聲明變量或者常量的時候還能夠加個類型标注,來限定這個變量或者常量能夠存儲什麼類型的值。寫法是在變量名或常量名後面加上冒号空格再加存儲類型。舉個樣例。我要聲明一個存儲String類型的變量,代碼就是 var welcomeMessage: String。冒号的意思是“...類型為...”。所曾經面的代碼能夠翻譯成:“聲明一個類型為String的變量welcomeMessage”。“類型為String”意思是說“能夠存儲不論什麼的String值”。

welcomeMessage如今能夠被指派,不會報錯了。 welcomeMessage = “Hello”

NOTE 實際上這個類型标注可能非常少用,假設在聲明變量或者常量的時候就給他個初始值,編譯器就能自己判斷出來變量或者常量的類型是什麼了。這個在後面類型安全與類型判斷裡面會江到。上面這個樣例中welcomeMessage沒有初始值。是以編譯器沒有辦法判斷出來他是什麼類型,也就須要用類型标注來指明變量類型了。

變量或常量命名

Swift變量常量命名非常自由,甚至能夠用中文或者表情字元來命名。

可是名稱裡面不能包括數學符号,大于小于号。或者保留的(或者非法的)Unicode編碼位。或者連接配接線與制表符。也不能用數字打頭。可是後面能夠用數字。

變量或者常量的名字不能反複聲明,類型也不能變。變量跟常量也不能互相轉變。

NOTE 假設你想用Swiftkeyword同名的名字,你能夠在名字前後加上倒引號(好像是數字1前面那個鍵)即可了。隻是要盡量避免使用keyword。除非說是沒的選了(比方說上司要求的)。

變量的值能夠改成跟現有值同樣類型的值。

常量就不一樣了,常量值一旦設定就不能改了,假設要給常量再指派,就會報錯了。

輸出常量和變量

能夠使用println函數來輸出常量或者變量的值。

println是用來輸出的全局函數。輸出結果最後會自己主動換行。

假設是用Xcode,println函數會把結果輸出到Xcode的控制台。(還有另外一個函數print,也是用來輸出的,可是print輸出的結尾不會自己主動換行。)

println函數能夠輸出不論什麼字元串。

println函數還能用來輸出更複雜的日志。跟Cocoa的NSLog函數差點兒相同。

日志能夠包括常量也能包括變量。

Swift使用字元串填補的方式在長字元串中使用常量或者變量。

用法是用括号把變量名括起來,前面在加個反斜杠。然後直接放入字元串中。

NOTE 使用字元串填補時的其它全部選項在後面字元串填補裡面會有介紹。

2.凝視

使用凝視能夠在代碼中增加一段不被運作的文字。編譯器編譯的時候會把全部的凝視都忽略掉。

Swift的凝視跟C的凝視很像,單行凝視用雙斜杠打頭。比方  // 這是一行凝視

多行凝視用/*開頭,*/結尾

可是多行凝視有一個跟C不一樣的地方,Swift的多行凝視能夠嵌套。你能夠先寫一個/*開頭。然後再寫個/*作為内層凝視,然後先用*/表示内層凝視結尾。再寫個*/表示外層凝視結尾。

能夠嵌套的多行凝視能讓我們非常友善的凝視掉一大塊兒内容,不用事先去看這塊兒内容裡面是不是已經有多行凝視了。

3.分号

跟很多程式設計語言不一樣。Swift不要求在每一行語句後面加分号。隻是你要是想加也能夠加。可是假設要在一行寫多條語句就必須加分号了。

4.整型

整型數是指沒有小數的數字。比方42啊,-23啊之類的。整型要麼是有符号的(正數,0,負數)要麼是無符号的(正數或者0)。

Swfit的無符号數提供8位。16位,32位以及64位的版本号。這些類型的命名方式跟C是差點兒相同的。

比方8位的無符号整型是UInt8,32位有符号整型是Int32。跟其它類型一樣,這些類型首字母都要大寫。

整型範圍

你能夠通過整型類型的min屬性和max屬性來擷取各自的最小值和最大值。

使用上面兩個屬性得到的數值的類型跟使用的類型是一樣的,比方上面得到的minValue和maxValue類型都是UInt8,假設要在表達式裡面跟其它變量計算或者比較,那其它的變量類型也要是這個類型。

Int

大部分情況下你不須要去指定整型詳細是幾位的,Swift提供了第二種整型類型,Int,這個類型的長度跟程式執行的機器字長一樣。32位平台執行,Int長度就跟Int32一樣。64位平台執行,Int長度就跟Int64一樣。

除非說你一定要使用特定長度的整型,不然盡量用Int來表示整型。這樣能提高代碼的一緻性和通用性。就算是32位平台,Int存儲範圍是-2147483648到2147483647,這範圍足夠大了。

UInt

Swift還提供了一種沒有符号的整型UInt,跟Int一樣長度由程式執行的平台決定。

NOTE 僅僅有當你确實須要使用無符号數的時候採用UInt,不然盡量使用Int,就算你知道要儲存的值不會有負數。使用Int能增強代碼的一緻性和通用性,避免了各種類型數字計算的時候再去類型轉換。

5.浮點數

浮點數就是帶小數部分的數字。比方3.1415。-273.354。

浮點型能存儲的數字範圍比整型大得多。而且能夠存儲比整型數最大值更大的數,和比整型數最小值更小的值。

Swift提供兩種帶符号的浮點數類型。

Double:占用64位,當要存儲的值很很大并且須要很精确的時候用Double。

Float:占32位,當你要用小數可是用不着Double的時候就用Float。

NOTE Double類型提供至少15位小數的精度。Float的小數精度僅僅有6位。

選哪種類型要依據你要處理的資料的實際情況。

6.類型安全與類型判斷

Swift是一種類型安全的語言。類型安全的語言要讓你清楚自己使用的變量是什麼類型。假設變量是String類型。就不能賦Int值給他哦。

由于Swift是類型安全的,是以編譯器在編譯代碼的時候要進行類型檢查,對于不論什麼類型比對不對的地方都會報錯。這個特性能讓你在開發的時候就發現并糾正非常多錯誤了。

當你要處理各種各樣不同類型的資料的時候,類型檢查能幫你避免非常多錯誤。

可是并非說你必須在聲明每個常量或者變量的時候就要指定相應的類型。

假設你不指定。Swift會自己主動判斷出相應的類型。類型判斷能夠讓編譯器在編譯的時候通過你提供的值來自己主動判斷出其所相應的資料類型。

由于有了類型判斷,Swift裡面的類型聲明就比C或者OC這種語言裡面少的多了。

當你聲明常量或者變量的同一時候還提供初始值得時候類型判斷就很好用了。通常要在聲明變量或者常量的時候給他提供一個字面值。(字面值就好比是個馬上數,不須要額外計算的。比方以下樣例中的42或者3.14159。

比方假設你把字面值42賦給一個剛聲明的常量,可是不指定常量類型,Swift會判斷出來這個常量是Int類型的,由于你提供的初始值是Int類型的。

假設你用浮點數做初始值。而且不指定類型,Swift判斷出來的結果就是Double。

Swift判斷小數類型的時候結果是Double而不會是Float。

假設你在表達式裡用整數和小數相加,結果判斷出來的是Double。

字面值3沒有明白表示自己的類型,而表達式中出現了Double類型。是以最後判斷出來的類型是Double。

7.數字字面值

整數字面值能夠用以下幾種方式表示:

十進制數字。沒有字首

二進制數字,0b開頭

八進制數字,0o開頭

十六進制數字,0x開頭

比方以下這幾個數字的十進制值都是17

小數字面值能夠是十進制(沒有字首),護着十六進制(0x開頭)。小數點兩邊都必須有數字。浮點數還有第二種指數表示方法,十進制浮點數用大寫或小寫字母E,十六進制浮點數用大寫或小寫字母P。

對于十進制來說假設指數是exp,就表示用基數乘以10的exp次方:

1.25e2表示1.25乘以10的2次方。或者125.0

1.25e-2表示1.25乘以10的-2次方,或者0.0125

對于十六進制數來說假設指數是ext,就表示用基數乘以2的exp次方:

0xFp2表示15乘以2的2次方,或者60.0

0xFp-2表示15乘以2的-2次方,或者3.75

以下的幾個浮點數字面量都是十進制的12.1875

數字字面值還能加一些其它的格式讓人更easy看懂。整數和浮點數都能在前面加入額外的0,還能加入下劃線。

這些格式都不會影響字面量的值。

8.數字類型轉換

要存儲數字的時候盡量都用Int,即便是你知道要存儲的值不會是負數。假設你每次都用預設的整型類型來定義常量和變量,這樣你定義的這些變量跟常量的類型就能跟字面值判斷出來的類型一樣了。代碼通用性就非常強。

僅僅有當你必需要用其它類型的整型的時候才去用。比方要在代碼上用确切位數來保證性能。或者記憶體優化或者其它必要的優化。使用指定長度的類型能夠幫助你避免一些不小心的值溢出。也能夠為資料提供一份隐式的說明。

整型轉換

對于整型常量或者變量,不一樣的數字類型能存儲的資料範圍是不同的。Int8類型能存儲的範圍是-128到127,UInt8能夠存儲的範圍是0到255。指派的時候假設資料超出這個範圍内,編譯器會報錯。

// and so this will also report an error

由于各種數字類型能存儲的資料範圍不同。是以你就必需要依據詳細情況來進行類型轉換了。

這樣能防止隐式轉換的錯誤,還能讓代碼裡的類型轉換意圖變得清晰。

要轉換成其它類型。你須要執行個體化一個須要轉換的類型的執行個體而且用現有的值給他初始化。拿上面的樣例來說。常量twoThousand是UInt6類型,而常量one是UInt8類型,由于類型不一樣是以兩個常量不能直接相加。以下樣例用UInt16(one)來建立一個UInt16類型的執行個體并用one來初始化。然後用這個值跟twoThousand相加。

如今加号兩邊都是UInt16了,是以不會報錯了。由于相加的和是UInt16型的,是以常量twoThousandAndOne也是UInt16類型。

類型(值)是調用類型的初始化器并傳入一個初始值的預設方式。當然這須要有個前提。就是UInt16有一個接受UInt8參數的初始化器,是以才幹用這個方式來用UInt8建立UInt16。

是以這裡你不能随便傳其它類型的,必須是UInt16提供了對應的初始化器的才行。

拓展現有的初始化器。加入新的類型參數支援(例如說要支援自定義的類型)在後面的擴充部分裡會介紹。

整型和浮點型的轉換

整型和浮點型之間轉換必需要顯式轉換。

這個樣例中常量three的被用來建立另外一個Double類型。這樣加号兩邊的類型才一樣。假設不轉換,是不能相加的。

反過來也是一樣的,Double或者Float類型的值也能夠用來初始化一個整型的值。

用浮點數來初始化整型數的時候小數部分都會被閹割,例如說4.75轉換變成4,-3.9轉換變成-3。

NOTE 數字變量或者常量相加的規則跟數字字面量相加規則是不一樣的(還記得前面有個3+0.14159嗎)。字面量3能夠直接跟字面量0.14159相加,由于字面量本身還沒有一個确切的類型,僅僅有當編譯器計算和的時候才會去判斷字面量的類型。

9.類型别名

類型别名是指使用現有類型的第二種方式。

類型别名使用keywordtypealias來定義。

當你想用更合适的方式來使用現有的類型的時候。類型别名就派上用場了。

例如說你要在外部代碼中使用指定長度的資料。

typealias AutioSample = UInt16

僅僅要你定義了類型别名。那其它僅僅要能用原名的地方都能用别名。

上面樣例AudioSample被定義成是UInt16的别名,是以調用AudioSample.min實際上就是調用UInt16.min。

10.布爾型

Swift有一個主要的布爾類型,叫Bool。布爾值是一種邏輯值,要麼是true要麼是false。Swift提供了兩個布爾的常量值。沒錯。你猜對了,true和false。

上面樣例中兩個常量分别用值true和false來初始化,是以編譯器給他們判斷出來的類型就是Bool。

跟前面聲明的Int和Double變量一樣。這裡你也不須要特别指明是Bool型。當然須要你在建立的時候用true或者false給他們初始化哦。

類型判斷要讓常量或者變量在建立的時候用還有一個類型已知的值來初始化,這讓Swift的代碼非常easy介紹也非常明了。

當你使用if之類的條件推斷語句的時候布爾值就顯得非常須要了。

條件推斷語句在後面流程控制裡面會細講。

Swift的類型安全機制會保證不能再須要Bool值得地方用其它類型的值來取代。以下的樣例就會報錯。

以下這樣寫才是對的。

i==1的比較結果是Bool類型的,是以另外一種方式能夠通過類型安全檢測,類似i==1這種比較運算會在後面的基本運算裡介紹。

跟其它的類型安全的樣例一樣。這個也能避免一些偶然的錯誤,保證代碼的意思清晰明了。

11.元組

元組能把好幾個值放在一起組成一個複合值。元組裡面的值能夠是不論什麼類型,各個值還不須要類型同樣。舉個樣例。(404, "NotFound")這個元組用來表示一個HTTP狀态碼。

HTTP狀态碼是指你向一個HTTPserver請求頁面的時候server傳回的一個特殊值,假設你請求的頁面不存在,server就會傳回404 Not Found。

(404, "NotFound")這個元組把Int和String結合在一起,傳回的HTT狀态碼有兩個值:一個數字,和一段人能看懂的描寫叙述。它能夠被稱為是類型為(Int, String)的元組。

你能夠使用不論什麼一組類型來建立元組。你想要不論什麼不同的類型,都能滿足你。沒有什麼能夠阻撓你建立(Int, Int, Int)或者(String, Bool)或者不論什麼其它的你想要的元組類型。

你能夠把元組的資料解析出來存進常量或者變量。比方以下這樣:

假設說你不須要某個位置的值,用下劃線來替換那個位置的名字就OK了。

或者你也能夠用下标來擷取元組裡面的值。

下标從0開始。

建立元組的時候還能給裡面的值命名。比方說let http200Status = (statusCode: 200, description: "OK")。假設這樣建立的話。就能用名字來擷取對應的值。

我經驗不多,隻是我感覺這東西跟JS的對象非常像啊。

元組用來作為函數的傳回值的時候特别實用。例如說有個檢索頁面的函數。傳回(Int, String)類型的元組來表示檢索頁面成功還是失敗。通過傳回帶有兩個值的元組,就能比僅僅傳回單個值的函數提供很多其它資訊。很多其它介紹,請檢視多傳回值函數。

NOTE 元組對于臨時組裝一些相關的資料很實用。他不須要你去定義一些複雜的資料結構。

假設你的資料結果不僅僅是臨時使用例如說還得存盤。這個時候使用建立一個類或者結果體會更合适。很多其它相關資訊請查閱類和結構。

12.可選值

假設說某個值有可能不存在,那你能夠使用可選值,可選值表示這裡有個值等于多少多少,或者說這裡沒有值。

NOTE C跟OC裡面是不存在可選值的概念的。

OC裡面跟可選值最接近的特性就是方法要麼傳回nil要麼傳回對象。傳回nil表示沒有可用的對象。可是這僅僅針對對象有效,對于結構體。基本類型或者枚舉類型是不适用的。對于這些類型,OC的方法傳回了一個特别的值(比方說NSNotFound)來說明這裡沒有值。這樣的方式要求調用方法的地方知道這裡會傳回特殊值。而且要記得去推斷。Swift的可選值就沒有類型的限制,也就不須要額外特殊額常量了。

這邊有個樣例,Swift的String類型有個方法叫做toInt。用來把字元串的值轉換成Int值。

可是。并非全部的字元串都能轉換成數字的,“123"能夠轉換成123可是”hello, china“顯然是轉不了的。

以下的樣例就用toInt方法來吧String轉換成Int:

由于toInt方法是有可能轉換失敗的,是以他傳回的是一個可選的Int,而不是Int。可選Int類型用"Int?"表示而不是"Int"。

問号表示這個值是可選的。也就是說變量裡面有可能是某個Int值,也有可能什麼都沒有。(注意這裡不可能包括其它比方Bool,或者String類型的值,要麼是Int要麼什麼都沒有。)

if語句和強行拆箱

你能夠使用if語句來驗證一個可選值是不是包括有值。假設有值。傳回的是true。假設沒有值傳回的就是false。

假設你确定可選值有值,你能夠在變量名後面加個感歎号來取得裡面的值。感歎号的意思相當于:”小樣兒我知道你帶的有錢。交出來哥要用。“這個就是可選值強制拆箱。

很多其它if語句的介紹。請參閱控制流。

NOTE 假設用感歎号去擷取沒有值的可選值,會發生執行時錯誤。一定要當你确定可選值有值的時候才使用感歎号。想想你鼓起勇氣打劫了個窮光蛋。一毛錢沒撈着還進去了。

可選值綁定

你也能夠用可選值綁定來驗證可選值裡面是不是有值,通過這樣的方式能夠讓可選值暫時存儲在一個暫時的常量或者變量裡。可選值綁定能夠用在if或者while的條件語句中推斷可選變量裡面是不是有值,而且順便把值取出來放到常量或者變量裡面。

if跟while在控制流裡面介紹。一般有點兒基礎的應該都能夠跳過了。

if中使用可選值綁定是以下這種

那麼上上面那個樣例就能用可選值綁定來取代強制拆箱了。

代碼翻譯為:”假設possibleNumber.toInt傳回的可選值裡面有值。那麼定義一個可選常量actualNumber,值就是方法傳回的值“。

假設轉換成功。常量actualNumber就能在if的大括号中面用了。并且actualNumber已經用轉換方法傳回的值初始化了,是以就沒有必要再用感歎号去擷取常量的值了。這個樣例中actualNumber僅僅是簡單的用來輸出轉換的結果。

在使用可選值綁定的時候能夠用常量也能夠用變量。假設你想在if第一個大括号中改動actualNumber的值,就用if var actualNumber取代,然後可選值包括的值就是個變量而不是常量了。

nil

假設你要把一個可選變量變成沒有值的狀态,給他指派為ni就能夠了。

NOTE nil不能用來給非可選變量或者常量指派,假設某個變量或者常量有可能會沒有值,一定要給他聲明成相應的可選類型。

記住是問号哦。

假設你定義一個可選常量或者變量的時候沒有提供預設值,那他的值會被自己主動設為nil。

NOTE Swift的nil跟OC裡面的nil不太一樣。在OC裡面nil是一個不指向不論什麼對象的指針,而在Swift裡面nil不是指針,并且說這個地方沒有值。不論什麼類型都能用nil,而不不過對象類型。

隐式拆箱可選值

上面說的,可選值是說能夠沒有值的常量或者變量。

可選值能夠用if語句來檢測是不是有值,也能夠用可選綁定來拆箱而且擷取當中的值。

有時候有的可選值裡面非常明顯總是會有值的。在這樣的情況下就沒有必要每次使用的時候都去檢查來拆箱擷取值,由于我确定他總是會有值得。這樣的可選值被稱為隐式拆箱可選值。

定義這樣的類型要在類型後面加感歎号,而不是問号。

當某個可選值被定義的時候就被指派,并且以後都能确定他總是會有值。這個時候隐式拆箱可選值就能夠使用。最開始使用隐式拆箱可選值的地方時在類初始化的地方。很多其它内容在無引用和隐式拆箱可選值屬性裡面介紹。

隐式拆箱可選值也就是一種可選值,可是還能像非可選值一樣來使用。而不想要每次使用的時候都去拆箱。以下舉個樣例說明可選字元串與隐式拆箱可選字元串的差别。

你能夠覺得隐式拆箱可選值是一種擁有自己主動拆箱權限的可選值。聲明可選變量的時候類型後面加感歎号就是隐式拆箱可選變量,就不用每次使用的時候都在變量名後面加感歎号了。

NOTE 假設你試圖訪問一個沒有值的隐式拆箱可選變量,會産生執行時錯誤,就像你在一個沒有值得可選變量後面加個感歎号一樣。

你還能夠像使用普通可選值一樣使用隐式産想可選值。比方說用If推斷其是否有值

NOTE 假設說可選值以後有可能會變成nil,就不要使用隐式拆箱可選。

假設變量生命周期内有可能須要檢測是否為nil就使用普通的可選。

13.斷言(Assetions)

可選類型能夠讓你檢測值是否存在,然後處理值不存在的情況。可是在有些情況下,假設值不存在就沒辦法進行,或者有值可是這個值不符合條件。這樣的情況下你能夠觸發斷言來結束運作,進而能夠調試為什麼值不存在。

使用斷言調試

斷言是指在運作期間檢測一個邏輯值是否為true。也就是說斷言斷定那個條件是true。你能夠使用斷言來保證程式運作的時候僅僅有當滿足了某個條件的時候才繼續往下運作。假設條件表達式計算結果為true,程式照常運作,假設結果為false,就不再運作了,應用也就退出了。

假設你在調試環境中執行代碼而且觸發了斷言,那你能夠清楚的看到哪裡的條件沒通過,而且能夠檢視當斷言觸發的時候應用時什麼狀态。斷言還能夠接受你提供的一些調試資訊。通過調用全局函數assert來使用斷言。第一個參數須要是範圍true或者false的表達式,第二個參數的資訊能夠在表達式傳回false的時候輸出。

上面樣例假設age>=0傳回true的話代碼還會繼續運作,也就是說age是非負數的時候。假設age是負數,age>=0就是false了,這個時候斷言就觸發了,應用終止。

注意第二個參數不能使用字元串填補。隻是第二個參數能夠省略,比方asset(age >= 0)

什麼時候要用斷言

假設說某個地方你一定須要滿足什麼條件才幹繼續運作的時候就能夠用斷言。當中包含下面場景:

在使用下智語法的時候數字下标的值不能太大也不能太小。

調用函數的時候假設傳遞非法參數函數就不能完畢任務。

有個可選值當時是nil,可是後面代碼的運作須要他有值。

NOTE 當某些條件達不到的時候斷言會讓應用終止,讓應用程式終止肯定不是最好的方式。可是在開發階段還是保證那些條件被注意到的有效的方式。

要做到這一點,該産品沒有被釋放。

上一篇: 導出app
下一篇: 樹莓派學習