1. 程式人生 > >Swift 值型別 和 引用型別的區別

Swift 值型別 和 引用型別的區別

本文參考 : The Swift Programming Language

值型別

值型別包括結構體, 列舉, 所有的基本型別(整數, 浮點數, 布林值, 字串, 陣列, 字典, 元組), 都是值型別

值型別被賦予給一個變數, 常數或者本身被傳遞給一個函式的時候, 實際上操作的是其的拷貝副本, 對該變數進行操作改變時, 本身並沒有變化.

    struct Resolution { // 定義一個結構體 Resolution
           var width = 0
            var heigth = 0
    }
    let hd = Resolution(width: 1920
, height: 1080) // 建立hd 結構體 var cinema = hd // 建立cinema 將hd的拷貝副本賦值給cinema cinema.width = 2048 print("cinema is now \(cinema.width) pixels wide") // 輸出 "cinema is now 2048 pixels wide" println("hd is still \(hd.width ) pixels wide") // 輸出 "hd is still 1920 pixels wide"

將hd賦值給cinema的時候, 實際上就是將hd中所儲存的值進行拷貝, 然後將拷貝的資料

儲存到新的cinema例項中, 結果就是兩個完全獨立的例項,(只不過包含相同的資料而已).

引用型別

引用型別包括 類.

引用型別與值不同, 引用型別在被賦值到一個變數,常量或者傳遞到一個函式時, 操作的並不是其拷貝的副本, 因此引用的是其例項本身, 操作改變也是對本身的改變.

定義一個類

class VideoMode {  // 定義一個 VideoMode le
            var resolution = Resolution()
            var interlaced = false
            var frameRate = 0.0
            var
name: String? } let tenEighty = VideoMode() tenEighty.resolution = hd tenEighty.interlacetrue tenEighty.name = "1080i" tenEighty.frameRate = 25.0 let alsoTenEighty = tenEighty alsoTenEighty.frameRate = 30.0 println("The frameRate property of tenEighty is now \(tenEighty.frameRate)") // 輸出 "The frameRate property of theEighty is now 30.0"

注意: alsoTenEighty和tenEighty都是用let宣告為常量, 依然可以改變他們的屬性,
這兩個常量本身相當於VideoMode()例項的引用,(我理解為儲存該例項的指標, 常量指定是該指標, 改變該例項的值並沒有改變指向該例項指標), 因為兩個常量本身不會改變, 它們並不儲存這個VideoMode例項,僅僅是對該例項的引用, 所以改變的是被引用VideoMode的frameRate引數, 而不改變常量的值

恆等運算子

因為類是引用型別, 有可能有多個常量和變數在後臺同時引用某一個例項(對於值型別不成立, 他們是直接拷貝,操作副本)
如何判斷兩個常量或者變數是否引用同一個例項?
用 “===” 和 “!==” 來判斷
“===” 等價於 “!==” 不等價於
等價於”===”表示兩個類型別的常量或者變數引用同一個類例項
等於表示兩個例項的值相等,也可以叫做相等