swift中有兩種型別:值型別(value type),引用型別(reference type)。
在swift中,所有的基本型別:整型(int)、浮點型(float)、布林型別(boolean)、字串型別(string)、陣列(array)、字典(dictionary)、元組(tuple)都是值型別,它們的底層都是以結構體(struct)的形式實現的,所以結構體(struct)也是值型別的,另外,列舉(enum)也屬於值型別。
值型別的變數在賦值時是值拷貝,例如:
var numbers:[string] = ["1","2","3"]
var new_numbers = numbers
print(numbers)
print(new_numbers)
控制台輸出結果:
上面的**中,變數numbers的值被賦於new_numbers時是值拷貝,從輸出結果可以看出,new_numbers新增新元素時,numbers的值並未發生改變。
這裡,著重說一下,結構體(struct)是值型別的,雖然結構體跟類(class)長得很像。
struct resolution
var hd = resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048
print(hd)
print(cinema)
控制台輸出結果:
swift中,類(class)屬於引用型別。與值型別不同,引用型別在被賦予到乙個變數、常量或者乙個函式時,其值不會被拷貝。因此,引用的是已存在的例項本身而不是其拷貝。
class videomode
let teneighty = videomode()
teneighty.name = "1080i"
teneighty.framerate = 25.0
以上示例中,宣告了乙個teneighty常量,其引用了videomode類的新例項,並設定了name為「1080i」,framerate為25.0 。
下面,我們將teneighty賦值給alsoteneighty的新常量,同時對alsoteneighty的framerate屬性進行修改:
let alsoteneighty = teneighty
alsoteneighty.framerate = 30.0
此時,我們在控制台列印teneighty.framerate 和alsoteneighty.framerate,結果為:
因為類是引用型別,所以teneighty和alsoteneighty引用的是相同的videomode例項。
需要注意的是,teneighty和alsoteneighty被宣告為常量而不是變數,然而你依然可以改變它們的framerate屬性。因為teneighty和alsoteneighty並不「儲存」videomode例項,而是僅僅是對videomode例項的引用,所以改變的是被引用的videomode的framerate屬性,而不是引用videomode的常量的值。
Swift值型別和引用型別
的乙份,比如結構體 struct 列舉 enum 元組 tuple 都是值型別。第二種是引用型別,該型別的例項共享資料唯一的乙份副本 在native層面說的話,就是該型別的每個例項都指向記憶體中的同乙個位址 比如類 class 就是引用型別。在這篇文章中,我們將深入 值型別和引用型別的使用價值,以及...
swift 值型別和引用型別
值型別被賦予給乙個變數,常數或者本身被傳遞給乙個函式的時候,實際上操作的是其的拷貝。在 swift 中,所有的基本型別 整數 integer 浮點數 floating point 布林值 booleans 字串 string 陣列 array 和字典 dictionaries 都是值型別,並且都是以...
Swift 中的值型別和引用型別
值型別和引用型別只在之前的面試過程中碰到過,最近學習過程中,在體驗 swift 的物件導向特性的時候,在 struct 和 class 中再次碰到了這個問題,說一說自己的收穫吧。值型別和引用型別在 oc 裡面理解起來應該更方便。在 oc 中,我們例項化物件的時候有兩種方式。一種是需要在變數名前面加個...