為什么 SwiftUI 的視圖使用結構體
本文轉載自微信公眾號「Swift社區」,作者韋弦Zhy 。轉載本文請聯系Swift社區公眾號。
如果您曾經為 UIKit 或 AppKit(Apple 的 iOS 和 macOS 原始用戶界面框架)編程,您會知道它們使用類而非結構體來構造視圖。SwiftUI 并非如此:我們更喜歡將結構體用于整體視圖,這有兩個原因。
首先,有一個性能因素:結構體比類更簡單,更快。我之所以說性能因素,是因為很多人認為這是 SwiftUI 使用結構體的主要原因,而實際上這只是更大范圍的一部分。
在 UIKit 中,每個視圖都來自一個名為UIView的類,該類具有許多屬性和方法:背景色,確定其放置方式的約束,用于將其內容呈現到其中的圖層等等。其中有很多,每個UIView和UIView子類都必須具有它們,因為繼承是這樣工作的。
struct or class
通常這不是問題,但是有一個名為 UIStackView 的特定子類,它類似于 SwiftUI 中的 VStack 和 HStack。在 UIKit 中,UIStackView 是一種非渲染視圖類型,旨在簡化布局,但這意味著即使它因為繼承的原因具有背景色,也從未真正使用過。
在 SwiftUI 中,我們所有的視圖都是簡單的結構體,幾乎可以自由創建。想想看:如果您制作一個僅包含一個整數的結構體,則結構體的整個大小就是:一個整數。沒有其他的。沒有從父類,祖父母類或曾祖父母類等繼承的多余值——它們完全包含您可以看到的內容,僅此而已。
得益于現代 iPhone 的強大功能,我不會慎重考慮后創建 1000 個整數甚至 100,000 個整數——眨眼之間就會發生。1000 個 SwiftUI 視圖甚至 100,000 個 SwiftUI 視圖也是如此。他們是如此之快,以至于不再值得考慮。
但是,盡管性能很重要,但視圖作為結構體還是有很多更重要的事情:它迫使我們考慮以一種干凈的方式隔離狀態。您會發現,類能夠自由更改其值,這可能導致代碼混亂—— SwiftUI 如何知道什么更改了值并需要更新 UI?
通過生成不會隨時間變化的視圖,SwiftUI 鼓勵我們轉向更具功能性的設計方法:在將數據轉換為 UI 時,我們的視圖變成簡單的,惰性的東西,而不是會失去控制的智能化的東西。
當您查看可以作為視圖的事物時,可以看到這一點。我們已經使用了 Color.red 和 LinearGradient 作為視圖——包含很少數據的簡單類型。實際上,您不能找到比使用 Color.red 作為視圖的更好的主意:除了“用紅色填充我的空間”之外,它不包含任何信息。
相比之下,Apple 的UIView文檔[1]列出了 UIView 擁有的約200種屬性和方法,無論是否需要它們,所有這些屬性和方法都將傳遞給其子類。
**提示:**如果您在視圖中使用類,則可能會發現代碼無法編譯或在運行時崩潰。
參考資料
[1]UIView文檔: https://developer.apple.com/documentation/uikit/uiview