Struct的優點
- 安全性:因為 Struct 是用值類型傳遞的,它們沒有引用計數。
- 內存:由于他們沒有引用數,他們不會因為循環引用導致內存泄漏。
- 速度:值類型通常來說是以棧的形式分配的,而不是用堆。因此他們比 Class 要快很多,真的很多,Struct的速度為Class的三千七百萬倍!
- 拷貝:你有在 Objective-C 里試圖過拷貝一個對象嗎?你必須選用正確的拷貝類型(深拷貝、淺拷貝),這是非常煩人的,因為每次嘗試你都不記得自己上次是怎么寫的。 值類型的拷貝則非常輕松!
- 線程安全:值類型是自動線程安全的。無論你從哪個線程去訪問你的 Struct ,都非常簡單。
Struct的不足
Objective-C:當你的項目的代碼是 Swift 和 Objective-C 混合開發時,你會發現在 Objective-C 的代碼里無法調用 Swift 的 Struct。因為要在 Objective-C 里調用 Swift 代碼的話,對象需要繼承于 NSObject。
Struct 不是 Objective-C 的好朋友。繼承:繼承是面向對象編程的四大支柱之一,這深深地植入了我們的思維方式。當我們可以使用繼承時,為什么還要重復地寫某一段代碼?我很喜歡把我的數據模型設為可繼承的,這讓我不用給共享一個抽象的類重復 JSON 解析代碼,這能讓我的模型保持統一。Struct 不能相互繼承。
NSUserDefaults:
我敢打包票大家都會在某些時候對把數據存在 NSUserDefaults 里面感到有罪惡感。這種想法很正常,因為不是每個人都喜歡跟 CoreData 打交道,特別是僅僅要存很少的對象的時候。 技術上這是可行的,但是要用 Struct 實現的話,這還有幾個小坑要踩。因此你可能最好還是用 Class 來實現。Struct 不能被序列化成 NSData 對象。
結論:
大概就是那么多,我已經點出了 Struct 的不足,同時也列出了一些 Struct 的優點去幫助你判斷是否使用 Struct 類型作為數據模型。
然而,你們完全可以搭配使用兩者。在我自己的項目里,如果模型較小,并且無需繼承、無需儲存到 NSUserDefault 或者無需 Objective-C 使用時,我會使用 Struct。
參考資料
Swift: 把 Struct 作為數據模型的注意事項
Why Choose Struct Over Class?
Swift: Caveats for Structs as data models