值類型和引用類型-Swift

本文譯自Value and Reference Types

類型在swift中有兩種鸦列,第一種,是 value type鹏倘,每個實例持有對自己的數(shù)據(jù)獨一無二的副本薯嗤。一般用來定義struct,enum,tuple.第二種,reference type實例共享一個副本數(shù)據(jù)纤泵,一般用來定義class骆姐。這這篇文章中我們來探索一下值value typereference type各自的優(yōu)缺點。在使用的時候如何做出選擇捏题。

他們的區(qū)別在哪里

對于value type來講玻褪,最大的不同點是copy,這影響公荧,賦值带射、初始化、參數(shù)的傳遞循狰。value type創(chuàng)建了一無依賴實例來持有數(shù)據(jù)唯一的副本窟社。

//Value type example
struct S { var data: Int = -1 }
var a = S()
var b = a                              //a is copied to b
a.data = 42                            // Changes a, not b
println("\(a.data),\(b.data)")         //prints "42, -1"

拷貝引用捻浦,換句話講,就是偷偷的創(chuàng)建了一個共享類型的實例桥爽。在拷貝之后,兩個變量其實是指向同一個內容昧识,所以修改第二個變量也會影響第一個钠四。eg:

//Reference type example
class C { var data: Int = -1 }
var x = C()
var y = x                            //x is copied to y
x.data = 42                          //changes the instance referred to by x (and y)
println("\(x.data), \(y.data)")      //prints "42, 42"

在安全領域這兩中角色的體現(xiàn)

其中一個選擇value type而不是reference type的原因就是使用value type可以更加簡潔明了的解釋你的代碼。如果你這樣做了--使用value type跪楞,你在修改你的變量的時候缀去,可以絕對的相信,沒有其他的部分會正在修改你的變量甸祭。在一個多線程操作的環(huán)境下這是特別有用的缕碎,不同的線程都可以修改你的數(shù)據(jù),這會引起一些讓你不愉快的bug池户,并且它們是非常難以調試咏雌。
上面的區(qū)別是數(shù)據(jù)發(fā)生改變的時候產生的。有一種情況校焦,value typereference type重疊:當實例沒有可寫的數(shù)據(jù)(沒有進行赊抖,賦值,傳參等)寨典,變化沒有發(fā)生時氛雪,value typereference type的行為是相同的。

意思是耸成,在沒有發(fā)生賦值操作的時候报亩,value typereference type沒有什么區(qū)別。
重疊:reference type可以通過let屬性修飾符井氢,讓它達到和value type某種程度上的相似

你也應該發(fā)現(xiàn)這是非常重要弦追。不可變class就是一個例子。在維護一個語意值上的優(yōu)勢的時候毙沾,這讓使用Cocoa NSObject對象更加的簡單骗卜。今天在Swift中,我們可以寫一個不可變的class左胞,通過使用一個不可變的stored propertyies寇仓,避免暴露的api可以修改任何數(shù)據(jù)狀態(tài)。事實上烤宙,許多普通的Cocoa類遍烦,例如 NSURL,被設計作為一種不可變的類躺枕。但是Swift目前沒有提供任何語言上的機制來強制classb永遠不能改變(在子類中可以把父類的let屬性服猪,重寫)供填。除了value type,structenum不可變。

如何做出選擇

那么如果你想要初始化一個類型罢猪,你如何選擇呢近她。當我們和Cocoa打交道的時候,許多API理所當然都是NSObject的子類膳帕,所以你必須使用class粘捎。對于這些情況,這里有一些指導:

使用value type
  • ==比較兩個實例才有意義的時候
  • 你想要通過copy達到一種沒有依賴的狀態(tài)
  • 數(shù)據(jù)將會被使用在多個線程中
使用reference type
  • ===比較兩個實例才有意義的時候
  • 你想要你的數(shù)據(jù)模型達到一種共享的可變化的狀態(tài)

在Swift中危彩,Array攒磨、StringDictionary都是值類型汤徽。它們的行為就像C中的int娩缰,擁有唯一的數(shù)據(jù)實例。你不需要做任何特殊的操作谒府,例如拼坎,做一個明確的拷貝,來防止其他的代碼在你沒注意的時候修改你的實例完疫。最重要的是演痒,你可以在非同步的情況下,很安全的傳遞你的數(shù)據(jù)趋惨。本著提高安全性的目的鸟顺,在Swift中,這種模型將會幫助你寫出更加可預測的代碼器虾。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末讯嫂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兆沙,更是在濱河造成了極大的恐慌欧芽,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葛圃,死亡現(xiàn)場離奇詭異千扔,居然都是意外死亡,警方通過查閱死者的電腦和手機库正,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門曲楚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人褥符,你說我怎么就攤上這事龙誊。” “怎么了喷楣?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵趟大,是天一觀的道長鹤树。 經(jīng)常有香客問我,道長逊朽,這世上最難降的妖魔是什么罕伯? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮叽讳,結果婚禮上捣炬,老公的妹妹穿的比我還像新娘。我一直安慰自己绽榛,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布婿屹。 她就那樣靜靜地躺著灭美,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昂利。 梳的紋絲不亂的頭發(fā)上届腐,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音蜂奸,去河邊找鬼犁苏。 笑死,一個胖子當著我的面吹牛扩所,可吹牛的內容都是我干的围详。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼祖屏,長吁一口氣:“原來是場噩夢啊……” “哼助赞!你這毒婦竟也來了?” 一聲冷哼從身側響起袁勺,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雹食,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后期丰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體群叶,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年钝荡,在試婚紗的時候發(fā)現(xiàn)自己被綠了街立。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡埠通,死狀恐怖几晤,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情植阴,我是刑警寧澤蟹瘾,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布圾浅,位于F島的核電站,受9級特大地震影響憾朴,放射性物質發(fā)生泄漏狸捕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一众雷、第九天 我趴在偏房一處隱蔽的房頂上張望灸拍。 院中可真熱鬧,春花似錦砾省、人聲如沸鸡岗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轩性。三九已至,卻和暖如春狠鸳,著一層夾襖步出監(jiān)牢的瞬間揣苏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工件舵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卸察,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓铅祸,卻偏偏與公主長得像坑质,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子临梗,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容