在 Swift 中 體會 class 與 struct 差異

作為Swift中的另外一種自定義類型诬像,從語法上來說,class和struct有很多相似的地方闸婴,例如:

struct PointValue {
    var x: Int
    var y: Int
}

class PointRef {
    var x: Int
    var y: Int
    
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

可以看到坏挠,它們都可以用來自定義類型、都可以有properties邪乍,也都可以有methods降狠。因此对竣,單純從語法上來理解class是個沒什么意義的事情。在之前我們也說過榜配,作為Swift中的引用類型否纬,class表達(dá)的是一個具有明確生命周期的對象,我們需要關(guān)注這類內(nèi)容的“生死存亡”蛋褥,而值類型烦味,我們更多關(guān)注的,就真的只是它的值而已壁拉。

引用類型必須明確指明 init 方法

首先谬俄,Swift并不會為class自動生成默認(rèn)的init方法。如果我們不定義它弃理,Swift編譯器會報錯溃论。因此,無論多么簡單的class痘昌,我們至少要為它定義一個初始化其所有屬性的init方法钥勋。
為什么要如此呢?前面提到了辆苔,class并不簡單表達(dá)一個“值”的概念算灸。Swift要求我們明確通過init方法說明“打造”一個對象的過程。相反驻啤,struct表達(dá)一個自定義的“值”菲驴,在沒有特別說明的情況下,一個值的初始化當(dāng)然是把它的每一個member都按順序初始化骑冗。

引用類型關(guān)注的是對象本身

其次赊瞬,class和struct對“常量”的理解是不同的。我們分別定義一個PointRef和PointValue的常量:

let p1 = PointRef(x: 0, y: 0)
let p2 = PointValue(x: 0, y: 0)

同樣是常量贼涩,當(dāng)我們修改p2的屬性時巧涧,編譯器會報錯:p2 is a let constant。但是我們卻可以修改 p1 遥倦,這是因?yàn)?p2 是一個值類型谤绳,常量的意義在于它的值不能被改變。但是 p1 是一個引用類型袒哥,這時候這個常量的意義則變成了:它可以修改自身的屬性缩筛,但不能再引用其他的對象。
除了這種語義上面的差別统诺,我們還可以看到如果我們進(jìn)行賦值操作歪脏,也會有差別

var p3 = p1
var p4 = p2

這個時候 如果我們修改 p3 的屬性那么 p1 的屬性也會一起被修改,但是當(dāng)我們修改 p4 的時候粮呢, p2 卻并沒有被修改。
引用類型默認(rèn)是可以修改屬性的,這是因?yàn)橐妙愋完P(guān)注的是其引用的對象而啄寡,不是對象的值豪硅。
值類型卻是默認(rèn)情況下不允許修改屬性的。如果你在寫接口的時候挺物,沒有用mutating來修飾你的方法懒浮,那么使用你接口的人就要抓狂了。他無法對你的屬性進(jìn)行操作识藤。(值類型的賦值操作就是基本的內(nèi)存拷貝砚著,因此你可以直接使用self進(jìn)行賦值操作,編譯器會自動將每一個屬性值設(shè)置到self對應(yīng)的屬性痴昧。然而在引用類型中稽穆,self是一個常量,不能在引用其它對象)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赶撰,一起剝皮案震驚了整個濱河市舌镶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌豪娜,老刑警劉巖餐胀,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瘤载,居然都是意外死亡否灾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門鸣奔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坟冲,“玉大人,你說我怎么就攤上這事溃蔫〗√幔” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵伟叛,是天一觀的道長私痹。 經(jīng)常有香客問我,道長统刮,這世上最難降的妖魔是什么紊遵? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮侥蒙,結(jié)果婚禮上暗膜,老公的妹妹穿的比我還像新娘。我一直安慰自己鞭衩,他們只是感情好学搜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布娃善。 她就那樣靜靜地躺著,像睡著了一般瑞佩。 火紅的嫁衣襯著肌膚如雪聚磺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天炬丸,我揣著相機(jī)與錄音瘫寝,去河邊找鬼。 笑死稠炬,一個胖子當(dāng)著我的面吹牛焕阿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播首启,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼暮屡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闽坡?” 一聲冷哼從身側(cè)響起谆构,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤莫瞬,失蹤者是張志新(化名)和其女友劉穎咕缎,沒想到半個月后谴蔑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡代承,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年汁蝶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片论悴。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡掖棉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膀估,到底是詐尸還是另有隱情幔亥,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布察纯,位于F島的核電站帕棉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饼记。R本人自食惡果不足惜香伴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望具则。 院中可真熱鬧即纲,春花似錦、人聲如沸博肋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拔稳,卻和暖如春葛峻,著一層夾襖步出監(jiān)牢的瞬間锹雏,已是汗流浹背巴比。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留礁遵,地道東北人轻绞。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像佣耐,于是被迫代替她去往敵國和親政勃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

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