Swift類和結構體對比
類和結構體對比
Swift 中類和結構體有很多共同點。共同處在於:
- 定義屬性用於儲存值
- 定義方法用於提供功能
- 定義附屬腳本用於訪問值
- 定義構造器用於生成初始化值
- 通過擴展以增加默認實現的功能
- 符合協議以對某類提供標準功能
更多信息請參見 屬性,方法,下標腳本,初始過程,擴展,和協議。
與結構體相比,類還有如下的附加功能:
- 繼承允許一個類繼承另一個類的特徵
- 類型轉換允許在運行時檢查和解釋一個類實例的類型
- 解構器允許一個類實例釋放任何其所被分配的資源
- 引用計數允許對一個類的多次引用
更多信息請參見繼承,類型轉換,初始化,和自動引用計數。
注意:
結構體總是通過被複制的方式在代碼中傳遞,因此請不要使用引用計數。
定義
類和結構體有着類似的定義方式。我們通過關鍵字class
和struct
來分別表示類和結構體,並在一對大括號中定義它們的具體內容:
class SomeClass {
// class definition goes here
}
struct SomeStructure {
// structure definition goes here
}
注意:
在你每次定義一個新類或者結構體的時候,實際上你是有效地定義了一個新的 Swift 類型。因此請使用UpperCamelCase
這種方式來命名(如SomeClass
和SomeStructure
等),以便符合標準Swift 類型的大寫命名風格(如String
,Int
和Bool
)。相反的,請使用lowerCamelCase
這種方式爲屬性和方法命名(如framerate
和incrementCount
),以便和類區分。
以下是定義結構體和定義類的示例:
struct Resolution {
var width = 0
var heigth = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
在上面的示例中我們定義了一個名爲Resolution
的結構體,用來描述一個顯示器的像素分辨率。這個結構體包含了兩個名爲width
和height
的儲存屬性。儲存屬性是捆綁和儲存在類或結構體中的常量或變量。當這兩個屬性被初始化爲整數0
的時候,它們會被推斷爲Int
類型。
在上面的示例中我們還定義了一個名爲VideoMode
的類,用來描述一個視頻顯示器的特定模式。這個類包含了四個儲存屬性變量。第一個是分辨率
,它被初始化爲一個新的Resolution
結構體的實例,具有Resolution
的屬性類型。新VideoMode
實例同時還會初始化其它三個屬性,它們分別是,初始值爲false
(意爲「non-interlaced video」)的interlaced
,回放幀率初始值爲0.0
的frameRate
和值爲可選String
的name
。name
屬性會被自動賦予一個默認值nil
,意爲「沒有name
值」,因它是一個可選類型。
類和結構體實例
Resolution
結構體和VideoMode
類的定義僅描述了什麼是Resolution
和VideoMode
。它們並沒有描述一個特定的分辨率(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
引用someResolution
的width
屬性,返回width
的初始值0
。
你也可以訪問子屬性,如何VideoMode
中Resolution
屬性的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 允許直接設置結構體屬性的子屬性。上面的最後一個例子,就是直接設置了someVideoMode
中resolution
屬性的width
這個子屬性,以上操作並不需要重新設置resolution
屬性。
結構體類型的成員逐一構造器(Memberwise Initializers for structure Types)
所有結構體都有一個自動生成的成員逐一構造器,用於初始化新結構體實例中成員的屬性。新實例中各個屬性的初始值可以通過屬性的名稱傳遞到成員逐一構造器之中:
let vga = resolution(width:640, heigth: 480)
與結構體不同,類實例沒有默認的成員逐一構造器。構造過程章節會對構造器進行更詳細的討論。