swift——類和結構體對比

來源:互聯網
上載者:User

標籤:objective-c   swift   ios   


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”)的inteflaced,回放幀率初始值為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 someResolutionis \(someResolution.width)")// 輸出 "The width ofsomeResolution is 0"


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

你也可以訪問子屬性,如何VideoMode中Resolution屬性的width屬性:

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


你也可以使用點文法為屬性變數賦值:

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


注意:

與 Objective-C 語言不同的是,Swift 允許直接設定結構體屬性的子屬性。上面的最後一個例子,就是直接設定了someVideoMode中resolution屬性的width這個子屬性,以上操作並不需要從新設定resolution屬性。

結構體類型的成員逐一初始化器

//Memberwise Initializers for structureTypes


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


與結構體不同,類執行個體沒有預設的成員逐一初始化器。構造過程章節會對初始化器進行更詳細的討論。

swift——類和結構體對比

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.