類和結(jié)構(gòu)體


最使人疲憊的往往不是道路的遙遠(yuǎn),而是你心中的郁悶;最使人頹廢的往往不是前途的坎坷,而是你自信的喪失;最使人痛苦的往往不是生活的不幸猿规,而是你希望的破滅;最使人絕望的往往不是挫折的打擊,而是心靈的死亡


前言

Swift語(yǔ)言同時(shí)支持類和結(jié)構(gòu)體兩種數(shù)據(jù)結(jié)構(gòu),類是面向?qū)ο缶幊讨蟹浅V匾囊粋€(gè)概念,而結(jié)構(gòu)體是從C語(yǔ)言中遺留下來(lái)的一種組合數(shù)據(jù)結(jié)構(gòu)窗悯。而Swift語(yǔ)言中結(jié)構(gòu)體的功能相對(duì)于C語(yǔ)言有了一定的提升,以至于在Swift語(yǔ)言中二者非常相似偷拔,常常令人難以取舍蒋院,今天我們就來(lái)揭示二者異同以及在實(shí)際開發(fā)中的取舍問(wèn)題。

相同點(diǎn)

在Swift語(yǔ)言中莲绰,結(jié)構(gòu)體和類都可以:

  • 都可以定義方法欺旧,屬性
  • 都能繼承或是實(shí)現(xiàn)某個(gè)協(xié)議
  • 都有自己的初始化方法
  • 都支持下標(biāo)訪問(wèn)語(yǔ)法
  • 都支持?jǐn)U展

二者的定義方式是一樣的:

class A {
    var p1:String?
    var p2:String?
    
    func f() {
      print("這是類的定義")
    }
}

struct A1 {
    var p1:String?
    var p2:String?
    
    func f() {
        print("這是結(jié)構(gòu)體的定義")
    }
}

不同點(diǎn)

盡管有很多相似的地方,但類和結(jié)構(gòu)體還是有很多不同的地方蛤签,下面就讓筆者為你一一道來(lái)辞友!

  • 類支持繼承
  • 支持deInit()方法(C++語(yǔ)言中叫析構(gòu)函數(shù))釋放資源
  • 引用計(jì)數(shù)器允許對(duì)一個(gè)類的多次引用
class B1 {
    var x:Int?
    var y:Int?
    
    init() {
        print("初始化方法,初始化時(shí)調(diào)用")
    }
    
    deinit {
        print("反初始化方法,釋放資源時(shí)調(diào)用")
    }
    
    func f() {
        print("B1->f()")
    }
}

class B2 : B1 {
    override func f() {
        print("B2->f()")
    }
}

let b1:B1 = B2()
b1.f()

struct B11 {
    var x:Int?
    var y:Int?
    
    init() {
        print("初始化方法,初始化時(shí)調(diào)用")
    }
    
    // 沒(méi)有deInit方法
//    deinit {
//        
//    }
}

// 不支持繼承
//struct B12 : B11 {
//
//}

除了上面的不同點(diǎn)之外震肮,類和結(jié)構(gòu)體還有幾處很重要的不同點(diǎn):

  • 編譯器為類自動(dòng)生成不帶參數(shù)的初始化方法称龙,而為結(jié)構(gòu)體生成帶所有屬性的初始化方法
  • 結(jié)構(gòu)體實(shí)例是值類型,類實(shí)例是引用類型
// 編譯器為二者自動(dòng)生成初始化函數(shù)
class C1 {
    var a:String?
    var b:String?
}

struct C11 {
    var a:String?
    var b:String?
}

let c1:C1 = C1()
c1.a = "a"
let c11:C11 = C11(a: "a", b: "b")

// 類實(shí)例是引用類型
// 改變c2實(shí)例的值也會(huì)改變c1的值
let c2:C1 = c1
print("a=\(c1.a!)")
c2.a = "aaa"
print("a=\(c1.a!)")
// 結(jié)構(gòu)體實(shí)例是值類型
// 改變c22的值不會(huì)改變c11的值
var c22:C11 = c11
print("a=\(c11.a!)")
c22.a = "aaa"
print("a=\(c11.a!)")

下面戳晌,我們用一張表格來(lái)概括類和結(jié)構(gòu)體的不同:

不同點(diǎn) 結(jié)構(gòu)體
默認(rèn)初始化函數(shù) 帶全部參數(shù) 不帶參數(shù)
實(shí)例類型 值類型 引用類型
繼承 不支持 支持

如何取舍

通過(guò)上面的分析鲫尊,我們可以知道,結(jié)構(gòu)體在設(shè)計(jì)上更偏向于數(shù)據(jù)的封裝沦偎。而類除了數(shù)據(jù)的封裝之外疫向,還偏向于針對(duì)數(shù)據(jù)的處理咳蔚。在類和結(jié)構(gòu)體不同點(diǎn)中,最重要的一點(diǎn)是:類實(shí)例是引用類型搔驼,而結(jié)構(gòu)體實(shí)例是值類型谈火,如果是數(shù)據(jù)的傳遞過(guò)程中,不希望影響原數(shù)據(jù)的值舌涨,請(qǐng)考慮結(jié)構(gòu)體糯耍,而如果本身考慮是對(duì)同一個(gè)實(shí)例進(jìn)行操作的話,則請(qǐng)考慮使用類囊嘉。還有一個(gè)非常重要的點(diǎn)是:結(jié)構(gòu)體不能實(shí)現(xiàn)繼承谍肤,多態(tài)等面向?qū)ο筇匦裕虼嘶┎绻紤]擴(kuò)展以及面向?qū)ο筇匦缘脑捇拇В舱?qǐng)使用類型。

概括來(lái)講:如果僅僅是針對(duì)數(shù)據(jù)的封裝的話焊刹,使用結(jié)構(gòu)體即可系任。而如果考慮運(yùn)行時(shí)特性以及類型的擴(kuò)展的話請(qǐng)使用類。

如果你喜歡我的這篇文章虐块,請(qǐng)點(diǎn)擊文章右上方的添加關(guān)注俩滥。如果你想和更多的人一起討論Swift語(yǔ)言,請(qǐng)加入我的Swift交流群贺奠,我們等著你霜旧。
也歡迎你fork這篇文章的源碼倉(cāng)庫(kù):https://github.com/yuanhoujun/Swift.git。更多的意見和討論請(qǐng)?jiān)谖恼孪路降脑u(píng)論里面告訴我

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末儡率,一起剝皮案震驚了整個(gè)濱河市挂据,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌儿普,老刑警劉巖崎逃,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異眉孩,居然都是意外死亡个绍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門浪汪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)巴柿,“玉大人,你說(shuō)我怎么就攤上這事死遭」慊郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵殃姓,是天一觀的道長(zhǎng)袁波。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蜗侈,這世上最難降的妖魔是什么篷牌? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮踏幻,結(jié)果婚禮上枷颊,老公的妹妹穿的比我還像新娘。我一直安慰自己该面,他們只是感情好夭苗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隔缀,像睡著了一般题造。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猾瘸,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天界赔,我揣著相機(jī)與錄音,去河邊找鬼牵触。 笑死淮悼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的揽思。 我是一名探鬼主播袜腥,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钉汗!你這毒婦竟也來(lái)了羹令?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤损痰,失蹤者是張志新(化名)和其女友劉穎特恬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徐钠,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡癌刽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尝丐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片显拜。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖爹袁,靈堂內(nèi)的尸體忽然破棺而出远荠,到底是詐尸還是另有隱情,我是刑警寧澤失息,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布譬淳,位于F島的核電站档址,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏邻梆。R本人自食惡果不足惜守伸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浦妄。 院中可真熱鬧尼摹,春花似錦、人聲如沸剂娄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阅懦。三九已至和二,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耳胎,已是汗流浹背儿咱。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留场晶,地道東北人混埠。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像诗轻,于是被迫代替她去往敵國(guó)和親钳宪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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