swift 實值型別和參考型別

來源:互聯網
上載者:User

標籤:strong   資料   width   io   art   cti   

實值型別

實值型別被賦予給一個變數,常數或者本身被傳遞給一個函數的時候,實際上操作的是其的拷貝。
在 Swift 中,所有的基本類型:
整數(Integer)、浮點數(floating-point)、布爾值(Booleans)、字串(string)、數組(array)和字典(dictionaries),都是實值型別,
並且都是以結構體的形式在後台所實現。
在 Swift 中,所有的結構體和枚舉都是實值型別。這意味著它們的執行個體,以及執行個體中所包含的任何實值型別屬性,在代碼中傳遞的時候都會被複製。

集合(Collection)類型的賦值和拷貝行為

Swift 中數組(Array)和字典(Dictionary)類型均以結構體的形式實現。
然而當數組被賦予一個常量或變數,或被傳遞給一個函數或方法時,其拷貝行為與字典和其它結構體有些許不同。
以下是對於數組,字典,字串和其它值的拷貝的描述:

  在你的代碼中,拷貝好像是確實是在有拷貝行為的地方產生過。  然而,在 Swift 的後台中,只有確有必要,實際(actual)拷貝才會被執行。  Swift 管理所有的值拷貝以確保效能最佳化的效能,  所以你也沒有必要去避免賦值以保證最優效能。(實際賦值由系統管理最佳化)

實際上我也不明白..就暫且當數組和字典在拷貝的時候是參考型別的

參考型別

參考型別在被賦予到一個變數、常量或者被傳遞到一個函數時,操作的是引用,其並不是拷貝。因此,引用的是已存在的執行個體本身而不是其拷貝。

let tenEighty = VideoMode()tenEighty.resolution = hdtenEighty.interlaced = truetenEighty.name = "1080i"tenEighty.frameRate = 25.0let alsoTenEighty = tenEightyalsoTenEighty.frameRate = 30.0if tenEighty === alsoTenTighty {    println("tenTighty and alsoTenEighty refer to the same Resolution instance.")}
請注意“等價於"(用三個等號表示,===) 與“等於"(用兩個等號表示,==)的不同:
“等價於”表示兩個類類型(class type)的常量或者變數引用同一個類執行個體。
等於”表示兩個執行個體的值“相等”或“相同”,判定時要遵照類設計者定義定義的評判標準,因此相比於“相等”,這是一種更加合適的叫法。
類和結構體的選擇

然而,結構體執行個體總是通過值傳遞,類執行個體總是通過引用傳遞。這意味兩者適用不同的任務。當你在考慮一個工程項目的資料構造和功能的時候,你需要決定每個資料構造是定義成類還是結構體。

按照通用的準則,當符合一條或多條以下條件時,請考慮構建結構體:

  • 結構體的主要目的是用來封裝少量相關簡單資料值。
  • 有理由預計一個結構體執行個體在賦值或傳遞時,封裝的資料將會被拷貝而不是被引用。
  • 任何在結構體中儲存的實值型別屬性,也將會被拷貝,而不是被引用。
  • 結構體不需要去繼承另一個已存在類型的屬性或者行為。

合適的結構體候選者包括:

  • 幾何形狀的大小,封裝一個width屬性和height屬性,兩者均為Double類型。
  • 一定範圍內的路徑,封裝一個start屬性和length屬性,兩者均為Int類型。
  • 三維座標系內一點,封裝xyz屬性,三者均為Double類型。

在所有其它案例中,定義一個類,產生一個它的執行個體,並通過引用來管理和傳遞。實際中,這意味著絕大部分的自訂資料構造都應該是類,而非結構體。

相關文章

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.