自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么 SwiftUI 的視圖使用結(jié)構(gòu)體

移動(dòng)開發(fā) iOS
如果您曾經(jīng)為 UIKit 或 AppKit(Apple 的 iOS 和 macOS 原始用戶界面框架)編程,您會(huì)知道它們使用類而非結(jié)構(gòu)體來構(gòu)造視圖。SwiftUI 并非如此:我們更喜歡將結(jié)構(gòu)體用于整體視圖,這有兩個(gè)原因。

[[414187]]

本文轉(zhuǎn)載自微信公眾號(hào)「Swift社區(qū)」,作者韋弦Zhy 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Swift社區(qū)公眾號(hào)。

如果您曾經(jīng)為 UIKit 或 AppKit(Apple 的 iOS 和 macOS 原始用戶界面框架)編程,您會(huì)知道它們使用類而非結(jié)構(gòu)體來構(gòu)造視圖。SwiftUI 并非如此:我們更喜歡將結(jié)構(gòu)體用于整體視圖,這有兩個(gè)原因。

首先,有一個(gè)性能因素:結(jié)構(gòu)體比類更簡單,更快。我之所以說性能因素,是因?yàn)楹芏嗳苏J(rèn)為這是 SwiftUI 使用結(jié)構(gòu)體的主要原因,而實(shí)際上這只是更大范圍的一部分。

在 UIKit 中,每個(gè)視圖都來自一個(gè)名為UIView的類,該類具有許多屬性和方法:背景色,確定其放置方式的約束,用于將其內(nèi)容呈現(xiàn)到其中的圖層等等。其中有很多,每個(gè)UIView和UIView子類都必須具有它們,因?yàn)槔^承是這樣工作的。

struct or class

通常這不是問題,但是有一個(gè)名為 UIStackView 的特定子類,它類似于 SwiftUI 中的 VStack 和 HStack。在 UIKit 中,UIStackView 是一種非渲染視圖類型,旨在簡化布局,但這意味著即使它因?yàn)槔^承的原因具有背景色,也從未真正使用過。

在 SwiftUI 中,我們所有的視圖都是簡單的結(jié)構(gòu)體,幾乎可以自由創(chuàng)建。想想看:如果您制作一個(gè)僅包含一個(gè)整數(shù)的結(jié)構(gòu)體,則結(jié)構(gòu)體的整個(gè)大小就是:一個(gè)整數(shù)。沒有其他的。沒有從父類,祖父母類或曾祖父母類等繼承的多余值——它們完全包含您可以看到的內(nèi)容,僅此而已。

得益于現(xiàn)代 iPhone 的強(qiáng)大功能,我不會(huì)慎重考慮后創(chuàng)建 1000 個(gè)整數(shù)甚至 100,000 個(gè)整數(shù)——眨眼之間就會(huì)發(fā)生。1000 個(gè) SwiftUI 視圖甚至 100,000 個(gè) SwiftUI 視圖也是如此。他們是如此之快,以至于不再值得考慮。

但是,盡管性能很重要,但視圖作為結(jié)構(gòu)體還是有很多更重要的事情:它迫使我們考慮以一種干凈的方式隔離狀態(tài)。您會(huì)發(fā)現(xiàn),類能夠自由更改其值,這可能導(dǎo)致代碼混亂—— SwiftUI 如何知道什么更改了值并需要更新 UI?

通過生成不會(huì)隨時(shí)間變化的視圖,SwiftUI 鼓勵(lì)我們轉(zhuǎn)向更具功能性的設(shè)計(jì)方法:在將數(shù)據(jù)轉(zhuǎn)換為 UI 時(shí),我們的視圖變成簡單的,惰性的東西,而不是會(huì)失去控制的智能化的東西。

當(dāng)您查看可以作為視圖的事物時(shí),可以看到這一點(diǎn)。我們已經(jīng)使用了 Color.red 和 LinearGradient 作為視圖——包含很少數(shù)據(jù)的簡單類型。實(shí)際上,您不能找到比使用 Color.red 作為視圖的更好的主意:除了“用紅色填充我的空間”之外,它不包含任何信息。

相比之下,Apple 的UIView文檔[1]列出了 UIView 擁有的約200種屬性和方法,無論是否需要它們,所有這些屬性和方法都將傳遞給其子類。

**提示:**如果您在視圖中使用類,則可能會(huì)發(fā)現(xiàn)代碼無法編譯或在運(yùn)行時(shí)崩潰。

參考資料

[1]UIView文檔: https://developer.apple.com/documentation/uikit/uiview

 

責(zé)任編輯:武曉燕 來源: Swift社區(qū)
相關(guān)推薦

2023-12-29 09:01:27

SwiftUI視圖修飾符

2021-11-26 12:00:07

包裝器SwiftU結(jié)構(gòu)體

2022-09-18 23:09:13

Go語言標(biāo)準(zhǔn)庫

2021-08-02 12:33:26

Swift修飾符視圖

2021-04-16 17:02:21

數(shù)組C++語言

2009-08-13 13:29:04

C#結(jié)構(gòu)體使用

2009-08-13 14:56:46

C#的結(jié)構(gòu)體使用

2022-08-24 09:02:27

SwiftUIiOS

2009-08-13 15:41:50

C#結(jié)構(gòu)體指針

2015-04-21 13:09:01

B+樹MySQL索引結(jié)構(gòu)

2019-02-12 06:24:51

2020-04-07 13:40:13

GraphQLAPI編程語言

2012-09-26 10:02:44

框架開發(fā)項(xiàng)目

2021-03-26 10:04:38

數(shù)據(jù)結(jié)構(gòu)技術(shù)

2024-05-07 09:24:12

Python源碼Java

2023-05-16 14:23:19

2017-07-03 13:33:42

AndroidItemDecorat

2010-06-17 15:53:41

WAP協(xié)議

2011-03-08 12:59:38

proftpd

2014-11-21 10:50:26

JavaString
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)