標籤: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
類型。
- 三維座標系內一點,封裝
x
,y
和z
屬性,三者均為Double
類型。
在所有其它案例中,定義一個類,產生一個它的執行個體,並通過引用來管理和傳遞。實際中,這意味著絕大部分的自訂資料構造都應該是類,而非結構體。