天天看點

【Swift】學習筆記(八)——類和結構體

1、類和結構體的定義

<pre name="code" class="html">struct Resolution {
    var width = 0
    var height = 0
}
class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?    //值為可選String類型的name
}
           

類:關鍵字class,  struct:結構體

2、建立類和結構體的執行個體(其他語言中稱執行個體為對象。)

let someResolution = Resolution()
let someVideoMode = VideoMode()
           

咦,很簡單啊,怎麼沒有關鍵字new呢。。。。  和将函數指派給變量是一樣的啊。是的。就這麼簡單。無需關鍵字。

3、結構體有一個逐屬性構造器,類木有。

let vga = Resolution(width:640, height: 480)
           

4、使用. 點 來通路屬性,包括通路和指派。

someVideoMode.resolution.width = 1280
           

5、結構體是值類型,類是引用類型。

6、類的恒等運算符 等價于(===),不等價于(!==)判斷兩個變量或常量是否引用了同一個執行個體

7、指針無需特定的(*)來表示是一個記憶體位址引用,也不需要特定的符号(->)來通路,它和通路屬性是一樣的 用 (.)點。

8、類和結構體的差別

Swift 中類和結構體有很多共同點。共同處在于:

  • 定義屬性用于存儲值
  • 定義方法用于提供功能
  • 定義附屬腳本用于通路值
  • 定義構造器用于生成初始化值
  • 通過擴充以增加預設實作的功能
  • 符合協定以對某類提供标準功能

與結構體相比,類還有如下的附加功能:

  • 繼承允許一個類繼承另一個類的特征
  • 類型轉換允許在運作時檢查和解釋一個類執行個體的類型
  • 解構器允許一個類執行個體釋放任何其所被配置設定的資源
  • 引用計數允許對一個類的多次引用

9、類和結構體的選擇

按照通用的準則,當符合一條或多條以下條件時,請考慮建構結構體:

  • 結構體的主要目的是用來封裝少量相關簡單資料值。
  • 有理由預計一個結構體執行個體在指派或傳遞時,封裝的資料将會被拷貝而不是被引用。
  • 任何在結構體中儲存的值類型屬性,也将會被拷貝,而不是被引用。
  • 結構體不需要去繼承另一個已存在類型的屬性或者行為。

合适的結構體候選者包括:

  • 幾何形狀的大小,封裝一個

    width

    屬性和

    height

    屬性,兩者均為

    Double

    類型。
  • 一定範圍内的路徑,封裝一個

    start

    屬性和

    length

    屬性,兩者均為

    Int

    類型。
  • 三維坐标系内一點,封裝

    x

    y

    z

    屬性,三者均為

    Double

    類型。

在所有其它案例中,定義一個類,生成一個它的執行個體,并通過引用來管理和傳遞。實際中,這意味着絕大部分的自定義資料構造都應該是類,而非結構體。