位置:首頁 > 高級語言 > Swift教學 > Swift類和結構體對比

Swift類和結構體對比

類和結構體對比

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

  • 定義屬性用於儲存值
  • 定義方法用於提供功能
  • 定義附屬腳本用於訪問值
  • 定義構造器用於生成初始化值
  • 通過擴展以增加默認實現的功能
  • 符合協議以對某類提供標準功能

更多信息請參見 屬性方法下標腳本初始過程擴展,和協議

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

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

更多信息請參見繼承類型轉換初始化,和自動引用計數


注意:
結構體總是通過被複製的方式在代碼中傳遞,因此請不要使用引用計數。
 

定義

類和結構體有著類似的定義方式。我們通過關鍵字classstruct來分彆表示類和結構體,並在一對大括號中定義它們的具體內容:

class SomeClass {
    // class definition goes here
}
struct SomeStructure {
    // structure definition goes here
}


注意:
在你每次定義一個新類或者結構體的時候,實際上你是有效地定義了一個新的 Swift 類型。因此請使用UpperCamelCase 這種方式來命名(如 SomeClass 和SomeStructure等),以便符合標準Swift 類型的大寫命名風格(如StringIntBool)。相反的,請使用lowerCamelCase這種方式為屬性和方法命名(如framerateincrementCount),以便和類區分。
 

以下是定義結構體和定義類的示例:

struct Resolution {
    var width = 0
    var heigth = 0
}
class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

在上麵的示例中我們定義了一個名為Resolution的結構體,用來描述一個顯示器的像素分辨率。這個結構體包含了兩個名為widthheight的儲存屬性。儲存屬性是捆綁和儲存在類或結構體中的常量或變量。當這兩個屬性被初始化為整數0的時候,它們會被推斷為Int類型。

在上麵的示例中我們還定義了一個名為VideoMode的類,用來描述一個視頻顯示器的特定模式。這個類包含了四個儲存屬性變量。第一個是分辨率,它被初始化為一個新的Resolution結構體的實例,具有Resolution的屬性類型。新VideoMode實例同時還會初始化其它三個屬性,它們分彆是,初始值為false(意為“non-interlaced video”)的interlaced,回放幀率初始值為0.0frameRate和值為可選Stringnamename屬性會被自動賦予一個默認值nil,意為“冇有name值”,因它是一個可選類型。

類和結構體實例

Resolution結構體和VideoMode類的定義僅描述了什麼是ResolutionVideoMode。它們並冇有描述一個特定的分辨率(resolution)或者視頻模式(video mode)。為了描述一個特定的分辨率或者視頻模式,我們需要生成一個它們的實例。

生成結構體和類實例的語法非常相似:

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

結構體和類都使用構造器語法來生成新的實例。構造器語法的最簡單形式是在結構體或者類的類型名稱後跟隨一個空括弧,如Resolution()VideoMode()。通過這種方式所創建的類或者結構體實例,其屬性均會被初始化為默認值。構造過程章節會對類和結構體的初始化進行更詳細的討論。

屬性訪問

通過使用點語法(dot syntax),你可以訪問實例中所含有的屬性。其語法規則是,實例名後麵緊跟屬性名,兩者通過點號(.)連接:

println("The width of someResolution is \(someResolution.width)")
// 輸出 "The width of someResolution is 0"

在上麵的例子中,someResolution.width引用someResolutionwidth屬性,返回width的初始值0

你也可以訪問子屬性,如何VideoModeResolution屬性的width屬性:

println("The width of someVideoMode is \(someVideoMode.resolution.width)")
// 輸出 "The width of someVideoMode is 0"

你也可以使用點語法為屬性變量賦值:

someVideoMode.resolution.width = 12880
println("The width of someVideoMode is now \(someVideoMode.resolution.width)")
// 輸出 "The width of someVideoMode is now 1280"


注意:
與 Objective-C 語言不同的是,Swift 允許直接設置結構體屬性的子屬性。上麵的最後一個例子,就是直接設置了someVideoModeresolution屬性的width這個子屬性,以上操作並不需要重新設置resolution屬性。
 

結構體類型的成員逐一構造器(Memberwise Initializers for structure Types)

所有結構體都有一個自動生成的成員逐一構造器,用於初始化新結構體實例中成員的屬性。新實例中各個屬性的初始值可以通過屬性的名稱傳遞到成員逐一構造器之中:

let vga = resolution(width:640, heigth: 480)

與結構體不同,類實例冇有默認的成員逐一構造器。構造過程章節會對構造器進行更詳細的討論。