swift學習之類和結構體

類和結構體對比

Swift 中類和結構體有不少共同點。共同處在於:數組

  • 定義屬性用於存儲值
  • 定義方法用於提供功能
  • 定義下標操做使得能夠經過下標語法來訪問實例所包含的值
  • 定義構造器用於生成初始化值
  • 經過擴展以增長默認實現的功能
  • 實現協議已提供某種標準功能

與結構體對比類還有以下的附加功能:數據結構

  • 類能夠繼承
  • 類容許在運行時檢查和解釋一個類實例 的類型
  • 類的析構器容許個類實例釋聽任何其所分配的資源
  • 引用計數容許對一個類的屢次引用

注意:結構體老是經過被複制的方式在代碼中傳遞,不適用引用計數。這是類和結構體的區別之一函數

類和結構體均可以使用點語法訪問其屬性。性能

注意:與Objective-C不一樣,Swift容許直接設置結構體的子屬性的值。好比在OC中 tableView.frame.origin.x = 200這種寫法就會報語法錯誤,而在Swift中則不會。優化

結構體都一個自動生成的成員逐一構造器,用於初始化結構體實例中的屬性。如:spa

CGRect.init(origin: , size: ) 然而類卻不會自動生成。.net

結構體和枚舉是值類型的

值類型被賦予一個變量,常量或者當作參數傳遞給函數的時候,其值會被拷貝。設計

在 Swift 中,全部的基本類型:整數(Integer)、浮 點數(floating-point)、布爾值(Boolean)、字符串(string)、數組(array)和字典(dictionary),都是 值類型,而且在底層都是以結構體的形式所實現。一樣全部的結構體和枚舉類型都是值類型。這意味着它們的實例,以及實例中所包含的任何值類型屬性,在代碼中傳遞的時候都會被複制。blog

類是引用類型

與值類型不一樣,引用類型在被賦予到一個變量 ,常量或者當作參數傳遞的時候,他的值 不會被拷貝。引用的是已存在的實例自己。繼承

恆等運算符

由於類是引用類型,有可能有多個常量或者變量同時引用了一個實例。(對於值類型來講,不會出現這種問題,由於他們的值在用到時老是拷貝一份),有時會有需求判斷兩個變量或者常量是否引用了同一個實例。爲此 Swift內建了兩個恆等運算符:

  • 等價於 ===
  • 不等價於 !==

這兩個運算符用來檢測兩個常量或者變量是否引用同一個實例。

注意: 「等價於」(用三個等號表示, === )與「等於」(用兩個等號表示, == )的不一樣:

1.「等價於」表示兩個類類型(class type)的常量或者變量引用同一個類實例。

2.「等於」表示兩個實例的值「相等」或「相同」,斷定時要遵守設計者定義的評判標準,所以相對於「相 等」來講,這是一種更加合適的叫法。

類和結構體的選擇

結構體和類均可以定義數據類型。結構體的實例老是經過值傳遞,而類的實例老是經過引用傳遞。這代表二者的使用場景不一樣。當咱們須要構建項目中的一個數據結構或者功能的時候,須要決定是使用結構體仍是類。

通常狀況下,符合如下一條或者幾條的時候能夠考慮使用結構體:

  • 該數據結構的主要目的是用來封裝少許相關的簡單數據。
  • 數據結構的實例在賦值或者傳遞時,封裝的數據將會被拷貝而不是被引用。
  • 該數據結構中存儲的值類型屬性,也應該被拷貝而不是被引用。
  • 該數據結構不須要去繼承一個既有的類型的屬性或者行爲。

舉例來講一下狀況適合使用結構體:

1.幾何圖形的大小,封裝一個width和height屬性,二者類型均爲CGFloat。

2.三維座標系一點,封裝x,y,z屬性,三者均爲Double類型。

在其餘的案例中,定義一個類,生成一個他的實例,並經過引用來傳遞。實際中這意味着絕大部分的數據結構都因該是類,而不是結構體。

String、Array和Dictionary類型的賦值與複製行爲。

Swift 中,許多基本類型,諸如 String , Array 和 Dictionary 類型均以結構體的形式實現。這意味着被賦值給 新的常量或變量,或者被傳入函數或方法中時,它們的值會被拷貝。

OC 中 NSString , NSArray 和 NSDictionary 類型均以類的形式實現,而並不是結構體。它們在被賦值或 者被傳入函數或方法時,不會發生值拷貝(除非你主動拷貝一份),而是傳遞現有實例的引用。

注意:以上是對字符串、數組、字典的「拷貝」行爲的描述。在你的代碼中,拷貝行爲看起來彷佛總會發生。然而,Swift 在幕後只在絕對必要時才執行實際的拷貝。Swift 管理全部的值拷貝以確保性能最優化,因此你不必去迴避賦值來保證性能最優化。

 

--------

以上參考Swift官方教程

相關文章
相關標籤/搜索