Swift里的值類型與引用類型 ???

? Swift里面的類型分為兩種:

值類型(Value Types):每個(gè)實(shí)例都保留了一分獨(dú)有的數(shù)據(jù)拷貝笼痛,一般以結(jié)構(gòu)體(struct)筛严、枚舉(enum)或者元組(tuple)的形式出現(xiàn)牍氛。

引用類型(Reference Type):每個(gè)實(shí)例共享同一份數(shù)據(jù)來源六水,一般以類(class)的形式出現(xiàn)。

?? 值類型與引用類型的區(qū)別

值類型和引用類型最基本的分別在復(fù)制之后的結(jié)果凰盔。當(dāng)一個(gè)值類型被復(fù)制的時(shí)候墓卦,相當(dāng)于創(chuàng)造了一個(gè)完全獨(dú)立的實(shí)例,這個(gè)實(shí)例保有屬于自己的獨(dú)有數(shù)據(jù)户敬,數(shù)據(jù)不會(huì)受到其他實(shí)例的數(shù)據(jù)變化影響:

// 下面是一個(gè)值類型的例子

structS{vardata:Int= -1}

var ?a =S() ?

var ?b = a// b是a的拷貝?

a.data =42// 更改a的數(shù)據(jù)落剪,b的不受影響

print("\(a.data),\(b.data)")// 輸出結(jié)果 "42, -1"

值類型就好像身份證復(fù)印件一樣,復(fù)印出來之后山叮,修改原件上面的內(nèi)容,復(fù)印件上的內(nèi)容不會(huì)變添履。

另一方面屁倔,復(fù)制一個(gè)引用類型的時(shí)候,實(shí)際上是默默地創(chuàng)造了一個(gè)共享的實(shí)例分身暮胧,兩者是共用一套數(shù)據(jù)锐借。因此修改其中任何一個(gè)實(shí)例的數(shù)據(jù),也會(huì)影響到另外那個(gè)往衷。

// 下面是一個(gè)引用類型的例子

classC{vardata:Int= -1}

var ? x =C()

var ? y = x// y是x的拷貝

x.data =42// 更改x的數(shù)據(jù)钞翔,等于同時(shí)修改了y

print("\(x.data),\(y.data)")// 輸出結(jié)果 "42, 42"


? ?Mutation(修改)在安全中扮演的角色

值類型較引用類型來說,會(huì)讓你更容易在大量代碼中理清狀況席舍。如果你總是得到一個(gè)獨(dú)立的拷貝出來的實(shí)例布轿,你就可以放心它不會(huì)被你app里面的其他部分代碼默默地修改。這在多線程的環(huán)境里面是尤為重要的来颤,因?yàn)榱硗庖粋€(gè)線程可能會(huì)在暗地里修改你的數(shù)據(jù)汰扭。因此可能會(huì)造成嚴(yán)重的程序錯(cuò)誤,這在調(diào)試過程中非常難以排除福铅。

由于差別主要在于修改數(shù)據(jù)的后果萝毛,那么當(dāng)實(shí)例的數(shù)據(jù)只讀,不存在需要更改的情況下滑黔,用哪種類型都是沒有分別的笆包。

你可能在想环揽,有的時(shí)候我可能也需要一個(gè)完全不變的類。這樣使用Cocoa NSObject對(duì)象的時(shí)候會(huì)比較容易庵佣,又可以保留值語義的好處歉胶。在今天,你可以通過只使用不可變的存儲(chǔ)屬性秧了,和避開任何可以修改狀態(tài)的API跨扮,用Swift寫出一個(gè)不可變類(immutable class)。實(shí)際上验毡,很多基本的Cocoa類衡创,例如NSURL,都是設(shè)計(jì)成不可變類的晶通。然而璃氢,Swift語言目前只強(qiáng)制struct和enum這種值類型的不可變性,對(duì)類這種引用類型則沒有狮辽。(例如還不支持強(qiáng)制將子類的限制為不可變類)

? ?如何選擇類型一也?

所以當(dāng)我們想要建立一個(gè)新的類型的時(shí)候,怎么決定用值類型還是引用類型呢喉脖?當(dāng)你使用Cocoa框架的時(shí)候椰苟,很多API都要通過NSObject的子類使用,所以這時(shí)候必須要用到引用類型class树叽。在其他情況下舆蝴,有下面幾個(gè)準(zhǔn)則:

? ?什么時(shí)候該用值類型(struct ,enum, tuple)

? ? ? ? ?要用==運(yùn)算符來比較實(shí)例的數(shù)據(jù)時(shí)

? ? ? ? ?你希望那個(gè)實(shí)例的拷貝能保持獨(dú)立的狀態(tài)時(shí)

? ? ? ? ?數(shù)據(jù)會(huì)被多個(gè)線程使用時(shí)

? ?什么時(shí)候該用引用類型(class)

? ? ? ? ?要用==運(yùn)算符來比較實(shí)例身份的時(shí)候

? ? ? ? ?你希望有創(chuàng)建一個(gè)共享的、可變對(duì)象的時(shí)候

在Swift里面题诵,數(shù)組(Array)洁仗、字符串(String)、字典(Dictionary)都屬于值類型性锭。它們就像C語言里面簡(jiǎn)單的int值赠潦,是一個(gè)個(gè)獨(dú)立的數(shù)據(jù)個(gè)體。你不需要花任何功夫來防范其他代碼在暗地里修改它們草冈。更重要的是她奥,你可以在線程之間安全的傳遞變量,而不需要特地去同步怎棱。在Swift高安全性的精神下方淤,這個(gè)模式會(huì)幫助你用Swift寫出更可控的代碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹄殃,一起剝皮案震驚了整個(gè)濱河市携茂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诅岩,老刑警劉巖讳苦,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件带膜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鸳谜,警方通過查閱死者的電腦和手機(jī)膝藕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咐扭,“玉大人芭挽,你說我怎么就攤上這事』确荆” “怎么了袜爪?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長薛闪。 經(jīng)常有香客問我辛馆,道長,這世上最難降的妖魔是什么豁延? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任昙篙,我火速辦了婚禮,結(jié)果婚禮上诱咏,老公的妹妹穿的比我還像新娘苔可。我一直安慰自己,他們只是感情好袋狞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布焚辅。 她就那樣靜靜地躺著,像睡著了一般硕并。 火紅的嫁衣襯著肌膚如雪法焰。 梳的紋絲不亂的頭發(fā)上秧荆,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天倔毙,我揣著相機(jī)與錄音,去河邊找鬼乙濒。 笑死陕赃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颁股。 我是一名探鬼主播么库,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼甘有!你這毒婦竟也來了诉儒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤亏掀,失蹤者是張志新(化名)和其女友劉穎忱反,沒想到半個(gè)月后泛释,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡温算,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年怜校,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚣旱,靈堂內(nèi)的尸體忽然破棺而出视搏,到底是詐尸還是另有隱情,我是刑警寧澤互例,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響锦庸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蒲祈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一甘萧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梆掸,春花似錦扬卷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卑硫,卻和暖如春徒恋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欢伏。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工入挣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硝拧。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓径筏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親障陶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滋恬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容