在swift中定義類型方法有很多種,其中一種就是以,引用和值來區分的。具體定義如下:
●值類型(Value Types):每個實例都保留了一分獨有的數據拷貝,一般以結構體 (struct)、枚舉(enum) 或者元組(tuple)的形式出現。
●引用類型(Reference Type):每個實例共享同一份數據來源,一般以類(class)的形式出現。
至于如何具體的來區分和理解這兩者可以用一個具體的例子來表示。
##### 值類型
以值類型定義一個對象 ? let ?a: [String] = ["值類型"1,"值類型2"] ?(Array為值類型)
如果這時候重新聲明一個元素 ? var b: [String] = a ?(let ?和 var 對值類型和引用類型無影響,這里聲明為var是因為接下來會修改b的內容)
此時(不考慮swift做的優化)a與b應該是不同的對象,因為是拷貝,所以a與b內容是相同的,但是內存已經不同因為a與b已經是兩個完全不同的對象了(但是此時在代碼里測試時發現a與b地址還是一樣的,這是因為swift對值類型做過優化,copy之后只要不對b做修改,那么a和b仍為同一個對象,這樣做為了減少內存的消耗)。
這時候對b做修改? b.append("值類型3")? 此時b得知變為["值類型"1,"值類型2","值類型3"]而a任然是["值類型"1,"值類型2"] ?a并沒有跟著b的值而變化,此時a與b內存地址也不相同。
##### 引用類型
以引用類型定義一個對象 ?let c: UIView = UIView() (UIView為class引用類型)
將c賦值給d ?let d: UIView = c (對于引用類型的賦值沒有copy的,所以對象c和d為同一個對象,修改c或者d里面的值時,另一個對象里面對應的值也會跟著變化,因為這兩個本就是同一個對象)
總結,值類型和引用類型最大的區別就是復制時的變化。值類型是生成一個新的對象,而引用類型使用同一個對象。