定義函數:
如果我們的函數是傳回一個複合值
如果你不确定傳回的元組一定不為nil,那麼你可以傳回一個可選的元組類型。
你可以通過在元組類型的右括号後放置一個問号來定義一個可選元組,例如(Int, Int)?或(String, Int, Bool)?
如果函數沒有傳回值
函數參數的名稱:
局部參數名
外部參數名:
最後需要注意的一點是:
一般預設在函數中定義的參數都是常量參數,也就是這個參數你隻可以查詢使用,不能改變它的值。
如果想要聲明一個變量參數,可以在參數定義前加 inout 關鍵字,這樣就可以改變這個參數的值了。
上面的兩句話意味着:如果我們需要寫一個小小的swap函數 就要加inout關鍵字在某個地方
當傳入的參數作為輸入輸出參數時,需要在參數名前加 & 符,表示這個值可以被函數修改。
在swift裡面 函數這個類型和其他類型沒有什麼差別,是以意味着 我可以定義一個類型為函數的常量或變量,并将适當的函數指派給它
更進一步想:
既然函數類型和其他并沒有差別,是以 函數類型可以作為參數傳給其他參數 并且甚至可以作為傳回類型
而且函數也可以嵌套:
函數嵌套指的是函數内定義一個新的函數,外部的函數可以調用函數内定義的函數。
結構體:
Swift 結構體是建構代碼所用的一種通用且靈活的構造體。
結構體的定義與使用:
結構體看上去是簡化版 的類的定義 那麼他的适用場景都有哪些呢?
按照通用的準則,當符合一條或多條以下條件時,請考慮建構結構體:
結構體的主要目的是用來封裝少量相關簡單資料值。
有理由預計一個結構體執行個體在指派或傳遞時,封裝的資料将會被拷貝而不是被引用。
任何在結構體中儲存的值類型屬性,也将會被拷貝,而不是被引用。
結構體不需要去繼承另一個已存在類型的屬性或者行為。
更具體一點 以下情景更适用于結構體
幾何形狀的大小,封裝一個width屬性和height屬性,兩者均為Double類型。
一定範圍内的路徑,封裝一個start屬性和length屬性,兩者均為Int類型。
三維坐标系内一點,封裝x,y和z屬性,三者均為Double類型。
類:
類與結構體些共同點和不同點:
5. 定義屬性用于存儲值
6. 定義方法用于提供功能
7. 定義附屬腳本用于通路值
8. 定義構造器用于生成初始化值
9. 通過擴充以增加預設實作的功能
10. 符合協定以對某類提供标準功能
類獨有的地方在于:
繼承允許一個類繼承另一個類的特征
類型轉換允許在運作時檢查和解釋一個類執行個體的類型
解構器允許一個類執行個體釋放任何其所被配置設定的資源
引用計數允許對一個類的多次引用
對于類的屬性的通路方式 swift和java 一樣。
類的構造器的定義:
屬性 就是将值跟特定的類、結構或枚舉關聯。
屬性可分為存儲屬性和計算屬性: 存儲常量或變量作為執行個體的一部分。計算屬性是計算(而不是存儲)一個值
有一種特殊類型的屬性叫延遲儲存屬性。是指當第一次被調用的時候才會計算其初始值的屬性。
這種屬性的适用場景:
延遲對象的建立。
當屬性的值依賴于其他未知類
比如:
方法:
看下面的代碼就會懂了