Swift 中的類和結構體

Swift 中的結構體的能力被大大增強,不只能夠擁有屬性,還以有方法、構造函數、甚至是擴展和遵照協議。這樣的結構體和類有不少相同點:ios

  • 屬性:存儲數據swift

  • 方法:提供一些功能數組

  • 下標:可使用下標語法函數

  • 構造器:生成初始化值spa

  • 擴展:增長功能code

  • 協議:提供某種通用功能blog

固然,類和結構體也有不少不一樣的地方,類還有許多獨有的附加功能:繼承

  • 繼承:一個類能夠繼承另外一個類的特徵內存

  • 類型轉換:運行時檢查和解釋一個類實例的類型資源

  • 析構器:一個類實例釋聽任何其所被分配的資源

  • 引用計數:對一個類的屢次引用

結構體會提供一個默認的構造函數,這個構造函數是結構體全部的屬性分別做爲參數來構建:

struct MyPoint {
    var x = 0
    var y = 0
}
let point:MyPoint = MyPoint(x: 1, y: 2)

結構體和枚舉都是值類型,值類型在賦值(給變量或者常量)和傳遞(做爲參數給一個函數)的時候都會被拷貝,值類型實例的值屬性也會被拷貝。
Swift 中的整型、浮點型、布爾型、字符串、字典、數組都是值類型,底層都是由結構體來實現的。

類是引用類型,引用類型在賦值和傳遞的時候,內容並不會被拷貝。所以賦值的實例和被賦值的實例實際上是一分內容,內容在內存中也是一份。

值類型和引用類型的區別在於,值類型在賦值和傳遞的時候是深拷貝,而引用類型是淺拷貝。
深拷貝就是把內存地址中存放的內容也拷貝一分內存中的內容就會有兩份;而淺拷貝只是拷貝了內存的地址,內存中的內容仍是隻有一份。

值和引用類型的區別

但須要注意的是,在 Swift 中,並非值類型一旦被賦值和傳遞的時候就會被拷貝一份,只有當須要的時候,好比被賦值的實例去改變內容的時候纔會真正的去拷貝。

那麼,咱們到底如何選擇結構體或者類呢?若是你只是用來作如下功能是能夠選擇結構體:

  • 只是用來封裝一些相關的數據

  • 這些數據被賦值或者傳遞的時候會被拷貝一份

  • 不須要被繼承

好比 CGPointCGRectCGSize等都是結構體。

本文首發於https://iosgg.cn/2016/10/12/swift_class_struct/

相關文章
相關標籤/搜索