Swift 中的值類(lèi)型與引用類(lèi)型(Value and Reference Types )

Swift 類(lèi)型分為兩種:值類(lèi)型與引用類(lèi)型。
值類(lèi)型:每個(gè)實(shí)例擁有獨(dú)一無(wú)二的數(shù)據(jù)拷貝,例如基礎(chǔ)數(shù)據(jù)類(lèi)型(Int、Float、Double等)、String、集合類(lèi)型(Dictionary、Set、Array)、元組、枚舉、結(jié)構(gòu)體等。
引用類(lèi)型:每個(gè)實(shí)例共享唯一一份數(shù)據(jù)拷貝,一般以類(lèi)(Class)形式出現(xiàn)。

區(qū)別

值類(lèi)型與引用類(lèi)型最基本的區(qū)別就是拷貝之后的結(jié)果,值類(lèi)型被拷貝的時(shí)候,相當(dāng)于建立一個(gè)新的獨(dú)立的實(shí)例,這個(gè)實(shí)例擁有自己的獨(dú)有的數(shù)據(jù)且不受其他實(shí)例的數(shù)據(jù)變化影響。也可以說(shuō)拷貝在賦值、初始化、傳遞參數(shù)等過(guò)程中的數(shù)據(jù)并為數(shù)據(jù)創(chuàng)建一個(gè)獨(dú)立的實(shí)例。

struct Person{
    var name: String?
    init(name:String?) {
        self.name = name
    }
}

var p1 = Person.init(name: "hehe")
var p2 = p1     //p2是p1的拷貝
p2.name = "haha" //修改p2的數(shù)據(jù),p1并不被受影響
print(p1.name!,p2.name!)
//打印:hehe haha

拷貝一個(gè)引用類(lèi)型的時(shí)候,本質(zhì)上是創(chuàng)建一個(gè)共享的實(shí)例的副本,兩者共用一套數(shù)據(jù)。在拷貝后,兩個(gè)實(shí)例指向了同一份數(shù)據(jù),所以修改其一的數(shù)據(jù),另一個(gè)實(shí)例隨之改變。

class Person{
    var name: String?
    init(name:String?) {
        self.name = name
    }
}

var p1 = Person.init(name: "hehe")
var p2 = p1     //p2是p1的拷貝
p2.name = "haha" //修改p2的數(shù)據(jù),p1的數(shù)據(jù)隨之改變,p1/p2共用一套數(shù)據(jù)
print(p1.name!,p2.name!)
//打印:haha haha

可變?cè)诎踩灾械慕巧?/h1>

使用值類(lèi)型可以不用擔(dān)心在某個(gè)地方對(duì)數(shù)據(jù)的修改而影響到其他地方的數(shù)據(jù)。在多線程環(huán)境中非常有用,因?yàn)椴煌木€程有可能會(huì)在不知情的情況下改變數(shù)據(jù)。發(fā)生這種Bug后,調(diào)試就非常困難。

因?yàn)橹殿?lèi)型和引用類(lèi)型的區(qū)別就在于當(dāng)你修改類(lèi)型實(shí)例的數(shù)據(jù)時(shí),它們對(duì)原始類(lèi)型數(shù)據(jù)的處理方式不同。但是有一種情況,值類(lèi)型和引用類(lèi)型的處理方式卻又相似,那就是當(dāng)類(lèi)型實(shí)例的數(shù)據(jù)為只讀的時(shí)候。在不存在修改的情況下,值類(lèi)型和引用類(lèi)型就沒(méi)什么區(qū)別了。

在Swift中可以通過(guò)定義不可改變的存儲(chǔ)屬性來(lái)創(chuàng)建一個(gè)不可變的類(lèi),避免暴露出的API被修改。許多普通的Cocoa框架里的類(lèi),如NSURL,都被設(shè)計(jì)成不可變的類(lèi)。

類(lèi)型選擇

創(chuàng)建一個(gè)新類(lèi)型的時(shí)候,如何選擇值類(lèi)型還是引用類(lèi)型呢?在使用Cocoa框架時(shí),很多API都是NSObject的子類(lèi),那么就必須要使用引用類(lèi)型,也就是類(lèi)class。其他情況下,參考如下:

使用值類(lèi)型的情景:
?使用==運(yùn)算符比較實(shí)例數(shù)據(jù)時(shí)。
?單獨(dú)復(fù)制一份實(shí)例數(shù)據(jù)時(shí)。
?在多線程環(huán)境下操作數(shù)據(jù)時(shí)。

使用引用類(lèi)型(比如class)的情景:
?當(dāng)使用===運(yùn)算符判斷兩個(gè)對(duì)象是否引用同一個(gè)實(shí)例時(shí)。
?需要?jiǎng)?chuàng)建一個(gè)共享的、可變的對(duì)象時(shí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,595評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,560評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,035評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,814評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,224評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,444評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,988評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,804評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,998評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評(píng)論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,237評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,665評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,927評(píng)論 1 287
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,706評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,993評(píng)論 2 374

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