Swift 值型別 和 引用型別的區別
阿新 • • 發佈:2018-12-23
本文參考 : 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引數, 而不改變常量的值
恆等運算子
因為類是引用型別, 有可能有多個常量和變數在後臺同時引用某一個例項(對於值型別不成立, 他們是直接拷貝,操作副本)
如何判斷兩個常量或者變數是否引用同一個例項?
用 “===” 和 “!==” 來判斷
“===” 等價於 “!==” 不等價於
等價於”===”表示兩個類型別的常量或者變數引用同一個類例項
等於表示兩個例項的值相等,也可以叫做相等