使用Struct作為數(shù)據(jù)模型的優(yōu)缺點(diǎn)
缺點(diǎn)
Objective-C
當(dāng)你的項(xiàng)目的代碼是 Swift 和 Objective-C 混合開發(fā)時(shí)委粉,你會(huì)發(fā)現(xiàn)在 Objective-C 的代碼里無(wú)法調(diào)用 Swift 的 Struct姻成。因?yàn)橐?Objective-C 里調(diào)用 Swift 代碼的話搬味,對(duì)象需要繼承于 NSObject。
Struct 不是 Objective-C 的好朋友。
繼承
繼承是面向?qū)ο缶幊痰乃拇笾е唬@深深地植入了我們的思維方式福稳。當(dāng)我們可以使用繼承時(shí),為什么還要重復(fù)地寫某一段代碼瑞侮?我很喜歡把我的數(shù)據(jù)模型設(shè)為可繼承的的圆,這讓我不用給共享一個(gè)抽象的類重復(fù) JSON 解析代碼,這能讓我的模型保持統(tǒng)一半火。
Struct 不能相互繼承越妈。
NSUserDefaults
我敢打包票大家都會(huì)在某些時(shí)候?qū)Π褦?shù)據(jù)存在 NSUserDefaults 里面感到有罪惡感。這種想法很正常慈缔,因?yàn)椴皇敲總€(gè)人都喜歡跟 CoreData 打交道叮称,特別是僅僅要存很少的對(duì)象的時(shí)候种玛。 技術(shù)上這是可行的藐鹤,但是要用 Struct 實(shí)現(xiàn)的話,這還有幾個(gè)小坑要踩赂韵。因此你可能最好還是用 Class 來實(shí)現(xiàn)娱节。
Struct 不能被序列化成 NSData 對(duì)象。
Struct 的優(yōu)點(diǎn)
我不希望你們認(rèn)為我不喜歡使用 Struct 是因?yàn)榻Y(jié)構(gòu)體傷了我的感情祭示。使用 Struct 來代替 Class 作為數(shù)據(jù)模型有很多好處肄满。值類型(value type)是非常有優(yōu)勢(shì)的:
-
安全性
因?yàn)?Struct 是用值類型傳遞的,它們沒有引用計(jì)數(shù)质涛。
-
內(nèi)存
由于他們沒有引用數(shù)稠歉,他們不會(huì)因?yàn)檠h(huán)引用導(dǎo)致內(nèi)存泄漏。
-
速度
值類型通常來說是以棧的形式分配的汇陆,而不是用堆怒炸。因此他們比 Class 要快很多,真的很多毡代!在 StackOverflow 給 struct 和 class 進(jìn)行相同操作的表現(xiàn)做了基準(zhǔn)測(cè)試阅羹,Struct 比 Class 要快九百倍勺疼。(Struct 的速度為 Class 的三千七百萬(wàn)倍)
-
拷貝
你有在 Objective-C 里試圖過拷貝一個(gè)對(duì)象嗎?你必須選用正確的拷貝類型(深拷貝捏鱼、淺拷貝)执庐,這是非常煩人的,因?yàn)槊看螄L試你都不記得自己上次是怎么寫的导梆。 值類型的拷貝則非常輕松轨淌!
-
線程安全
值類型是自動(dòng)線程安全的。無(wú)論你從哪個(gè)線程去訪問你的 Struct 看尼,都非常簡(jiǎn)單猿诸。