天天看點

快看Sample代碼,速學Swift語言(2)-基礎介紹

Swift語言是一個新的程式設計語言,用于iOS, macOS, watchOS, 和 tvOS的開發,不過Swift很多部分内容,我們可以從C或者Objective-C的開發經驗獲得一種熟悉感。Swift提供很多基礎類型,如Int,String,Double,Bool等類型,它和Objective-C的相關類型對應,不過他是值類型,而Objective-C的基礎類型是引用類型,另外Swift還提供了幾個集合類型,如<code>Array</code>, <code>Set</code>, 和 <code>Dictionary;Swift引入一些Objective-C裡面沒有的元祖類型,這個在C#裡倒是有類似的,也是這個名詞。 Swift語言是一種類型安全的強類型語言,不是類似JavaScript的弱類型,能夠在提供開發效率的同時,減少正常出錯的可能,使我們在開發階段盡量發現一些類型轉換的錯誤并及時處理。</code>

1

2

<code>let</code> <code>maximumNumberOfLoginAttempts</code> <code>= </code><code>10</code>

<code>var</code> <code>currentLoginAttempt</code> <code>= </code><code>0</code>

 常量用let定義,變量用var定義,它們均可以通過自動推導類型,如上面的就是指定為整形的類型。

也可以通過逗号分開多個定義,如下所示

<code>var</code> <code>x</code> <code>= </code><code>0.0</code><code>, </code><code>y</code> <code>= </code><code>0.0</code><code>, </code><code>z</code> <code>= </code><code>0.0</code>

 如果我們的變量沒有初始化值來确定它的類型,我們可以通過指定類型來定義變量,如下所示

3

<code>var</code> <code>welcomeMessage</code><code>: </code><code>String</code>

<code>var</code> <code>red</code><code>, </code><code>green</code><code>, </code><code>blue</code><code>: </code><code>Double</code>

 變量的列印,可以在輸出字元串中用括号包含變量輸出,括号前加斜杠 \ 符号。

4

5

6

7

8

<code>// This is a comment.</code>

<code>/* This is also a comment</code>

<code> </code><code>but is written over multiple lines. */</code>

<code>/* This is the start of the first multiline comment.</code>

<code> </code><code>/* This is the second, nested multiline comment. */</code>

<code> </code><code>This is the end of the first multiline comment. */</code>

 上面分别是正常的的注釋,以及Swift支援嵌套的注釋符号

Swift語句的劃分可以不用分号,不過你加分号也可以,如果加分号,則可以多條語句放在一行。

<code>let</code> <code>cat</code> <code>= </code><code>""</code><code>; </code><code>print</code><code>(</code><code>cat</code><code>)</code>

一般情況下,我們不需要指定具體的Int類型,如Int32,Int64,我們一般采用int類型即可,這樣可以在不同的系統平台有不同的意義。

在32位平台,Int代表是Int32

在64位平台,Int代表Int64

Swift的浮點數字類型包括有Float(單精度)和Double(雙精度)兩個類型,Float代表32位浮點數字,Double代表64位浮點數字。

預設通過小數值推導的變量或者常量的類型是Double,而非Float。

<code>let</code> <code>decimalInteger</code> <code>= </code><code>17</code>

<code>let</code> <code>binaryInteger</code> <code>= </code><code>0b10001</code>       <code>// 17 二進制</code>

<code>let</code> <code>octalInteger</code> <code>= </code><code>0o21</code>           <code>// 17 八進制</code>

<code>let</code> <code>hexadecimalInteger</code> <code>= </code><code>0x11</code>     <code>// 17 十六進制</code>

<code>let</code> <code>decimalDouble</code> <code>= </code><code>12.1875</code>

<code>let</code> <code>exponentDouble</code> <code>= </code><code>1.21875e1</code>  <code>//科學計數法 1.21875*10</code>

<code>let</code> <code>hexadecimalDouble</code> <code>= </code><code>0xC.3p0</code> <code>// p0代表 2的0次方</code>

 上面是科學計數方式的幾種方式

<code>let</code> <code>paddedDouble</code> <code>= </code><code>000123.456</code>

<code>let</code> <code>oneMillion</code> <code>= </code><code>1_000_000</code>

<code>let</code> <code>justOverOneMillion</code> <code>= </code><code>1_000_000.000_000_1</code>

 上面是使用0代替補齊簽名數字,以及下劃線來辨別數字分割,友善閱讀

<code>let</code> <code>three</code> <code>= </code><code>3</code>

<code>let</code> <code>pointOneFourOneFiveNine</code> <code>= </code><code>0.14159</code>

<code>let</code> <code>pi</code> <code>= </code><code>Double</code><code>(</code><code>three</code><code>) + </code><code>pointOneFourOneFiveNine</code>

 常量 three 初始化位整形類型, pointOneFourOneFiveNine 推導為Double類型,而pi則通過Double轉換推導為Double類型,這樣右邊兩個都是Double類型,可以進行相加的運算處理了。

<code>let</code> <code>orangesAreOrange</code> <code>= </code><code>true</code>

<code>let</code> <code>turnipsAreDelicious</code> <code>= </code><code>false</code>

 這個沒有什麼好講的,就是語言預設有布爾類型提供,相對于Objective-C的非0則為True而言,布爾類型隻有兩個字,True或者False。

布爾類型可以用于條件判斷等處理,如下

<code>if</code> <code>turnipsAreDelicious</code> <code>{</code>

<code>    </code><code>print</code><code>(</code><code>"Mmm, tasty turnips!"</code><code>)</code>

<code>} </code><code>else</code> <code>{</code>

<code>    </code><code>print</code><code>(</code><code>"Eww, turnips are horrible."</code><code>)</code>

<code>}</code>

元祖類型就是組合多個值的一個對象類型,在組合中的類型可以是任何Swift的類型,而且不必所有的值為相同類型。

<code>let</code> <code>http404Error</code> <code>= (</code><code>404</code><code>, </code><code>"Not Found"</code><code>)</code>

<code>// http404Error is of type (Int, String), and equals (404, "Not Found")</code>

 另外可以解構對應的元祖類型的值到對應的常量或者變量裡面,如下代碼

<code>let</code> <code>(</code><code>statusCode</code><code>, </code><code>statusMessage</code><code>) = </code><code>http404Error</code>

<code>print</code><code>(</code><code>"The status code is \(</code><code>statusCode</code><code>)"</code><code>)</code>

<code>// Prints "The status code is 404"</code>

<code>print</code><code>(</code><code>"The status message is \(</code><code>statusMessage</code><code>)"</code><code>)</code>

<code>// Prints "The status message is Not Found"</code>

 也可以通過下劃線來忽略相關的值,如下

<code>let</code> <code>(</code><code>justTheStatusCode</code><code>, </code><code>_</code><code>) = </code><code>http404Error</code>

<code>print</code><code>(</code><code>"The status code is \(</code><code>justTheStatusCode</code><code>)"</code><code>)</code>

 元祖對象裡面的值可以通過數字索引來引用,如0,1的屬性,如下

<code>print</code><code>(</code><code>"The status code is \(</code><code>http404Error</code><code>.</code><code>0</code><code>)"</code><code>)</code>

<code>print</code><code>(</code><code>"The status message is \(</code><code>http404Error</code><code>.</code><code>1</code><code>)"</code><code>)</code>

這個和C#裡面的可空類型是對應的,也就是對象可能有值,也可能沒有值

Int類型的構造函數為可空構造函數,有可能轉換失敗,是以傳回的為可空Int類型

可空類型可以通過設定nil,來設定它為無值狀态

<code>var</code> <code>serverResponseCode</code><code>: </code><code>Int</code><code>? = </code><code>404</code>

<code>// serverResponseCode contains an actual Int value of 404</code>

<code>serverResponseCode</code> <code>= </code><code>nil</code>

<code>// serverResponseCode now contains no value</code>

 對于可空類型,如果确認它的值非空,那麼可以強行解構它的值對象,通路它的值在變量後面增加一個!符号,如下所示

<code>if</code> <code>convertedNumber</code> <code>!= </code><code>nil</code> <code>{</code>

<code>    </code><code>print</code><code>(</code><code>"convertedNumber has an integer value of \(</code><code>convertedNumber</code><code>!</code><code>)."</code><code>)</code>

 一般情況下,我們可以通過可空綁定的方式來處理這種對象的值,語句文法如下所示

<code>if</code> <code>let</code> <code>constantName</code> <code>= </code><code>someOptional</code> <code>{</code>

<code>    </code><code>statements</code>

 具體的語句如下所示

<code>if</code> <code>let</code> <code>actualNumber</code> <code>= </code><code>Int</code><code>(</code><code>possibleNumber</code><code>) {</code>

<code>    </code><code>print</code><code>(</code><code>"\"\(</code><code>possibleNumber</code><code>)\" has an integer value of \(</code><code>actualNumber</code><code>)"</code><code>)</code>

<code>    </code><code>print</code><code>(</code><code>"\"\(</code><code>possibleNumber</code><code>)\" could not be converted to an integer"</code><code>)</code>

<code>// Prints ""123" has an integer value of 123"</code>

 也可以多個let的可空綁定語句一起使用

9

10

11

12

13

<code>if</code> <code>let</code> <code>firstNumber</code> <code>= </code><code>Int</code><code>(</code><code>"4"</code><code>), </code><code>let</code> <code>secondNumber</code> <code>= </code><code>Int</code><code>(</code><code>"42"</code><code>), </code><code>firstNumber</code> <code>&lt;</code> <code>secondNumber</code> <code>&amp;</code><code>&amp;</code> <code>secondNumber</code> <code>&lt;</code> <code>100</code> <code>{</code>

<code>    </code><code>print</code><code>(</code><code>"\(</code><code>firstNumber</code><code>) &lt; \(</code><code>secondNumber</code><code>) &lt; 100"</code><code>)</code>

<code>// Prints "4 &lt; 42 &lt; 100"</code>

<code> </code> 

<code>if</code> <code>let</code> <code>firstNumber</code> <code>= </code><code>Int</code><code>(</code><code>"4"</code><code>) {</code>

<code>    </code><code>if</code> <code>let</code> <code>secondNumber</code> <code>= </code><code>Int</code><code>(</code><code>"42"</code><code>) {</code>

<code>        </code><code>if</code> <code>firstNumber</code> <code>&lt;</code> <code>secondNumber</code> <code>&amp;</code><code>&amp;</code> <code>secondNumber</code> <code>&lt;</code> <code>100</code> <code>{</code>

<code>            </code><code>print</code><code>(</code><code>"\(</code><code>firstNumber</code><code>) &lt; \(</code><code>secondNumber</code><code>) &lt; 100"</code><code>)</code>

<code>        </code><code>}</code>

<code>    </code><code>}</code>

解包可空類型可以通過!符号進行處理,一般情況如下所示進行判斷

<code>let</code> <code>possibleString</code><code>: </code><code>String</code><code>? = </code><code>"An optional string."</code>

<code>let</code> <code>forcedString</code><code>: </code><code>String</code> <code>= </code><code>possibleString</code><code>! </code><code>// requires an exclamation mark</code>

<code>let</code> <code>assumedString</code><code>: </code><code>String</code><code>! = </code><code>"An implicitly unwrapped optional string."</code>

<code>let</code> <code>implicitString</code><code>: </code><code>String</code> <code>= </code><code>assumedString</code> <code>// no need for an exclamation mark</code>

 也可以使用可空綁定的let 語句進行隐式的解包,如下所示

<code>if</code> <code>let</code> <code>definiteString</code> <code>= </code><code>assumedString</code> <code>{</code>

<code>    </code><code>print</code><code>(</code><code>definiteString</code><code>)</code>

<code>// Prints "An implicitly unwrapped optional string."</code>

函數抛出異常,通過在函數裡面使用throws進行聲明,如下

<code>func</code> <code>canThrowAnError</code><code>() </code><code>throws</code> <code>{</code>

<code>    </code><code>// this function may or may not throw an error</code>

 捕捉函數抛出的異常代碼如下

<code>do</code> <code>{</code>

<code>    </code><code>try</code> <code>canThrowAnError</code><code>()</code>

<code>    </code><code>// no error was thrown</code>

<code>} </code><code>catch</code> <code>{</code>

<code>    </code><code>// an error was thrown</code>

 詳細的案例代碼如下所示

<code>func</code> <code>makeASandwich</code><code>() </code><code>throws</code> <code>{</code>

<code>    </code><code>// ...</code>

<code>    </code><code>try</code> <code>makeASandwich</code><code>()</code>

<code>    </code><code>eatASandwich</code><code>()</code>

<code>} </code><code>catch</code> <code>SandwichError</code><code>.</code><code>outOfCleanDishes</code> <code>{</code>

<code>    </code><code>washDishes</code><code>()</code>

<code>} </code><code>catch</code> <code>SandwichError</code><code>.</code><code>missingIngredients</code><code>(</code><code>let</code> <code>ingredients</code><code>) {</code>

<code>    </code><code>buyGroceries</code><code>(</code><code>ingredients</code><code>)</code>

Swift提供一些标準庫函數來進行斷言調試,分為斷言和預設條件的處理兩部分。

斷言調試僅僅在Debug調試模式運作,而預設條件則是調試模式和産品釋出後都會運作的。

<code>let</code> <code>age</code> <code>= -</code><code>3</code>

<code>assert</code><code>(</code><code>age</code> <code>&gt;</code><code>= </code><code>0</code><code>, </code><code>"A person's age can't be less than zero."</code><code>)</code>

<code>// This assertion fails because -3 is not &gt;= 0.</code>

<code>if</code> <code>age</code> <code>&gt;</code> <code>10</code> <code>{</code>

<code>    </code><code>print</code><code>(</code><code>"You can ride the roller-coaster or the ferris wheel."</code><code>)</code>

<code>} </code><code>else</code> <code>if</code> <code>age</code> <code>&gt;</code> <code>0</code> <code>{</code>

<code>    </code><code>print</code><code>(</code><code>"You can ride the ferris wheel."</code><code>)</code>

<code>    </code><code>assertionFailure</code><code>(</code><code>"A person's age can't be less than zero."</code><code>)</code>

 預設條件代碼如下,用來對一些條件進行校驗

<code>// In the implementation of a subscript...</code>

<code>precondition</code><code>(</code><code>index</code> <code>&gt;</code> <code>0</code><code>, </code><code>"Index must be greater than zero."</code><code>)</code>