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

為什么 SwiftUI 的修飾符順序很重要

移動開發(fā) iOS
每當我們將修飾符應(yīng)用于 SwiftUI 視圖時,我們實際上都會創(chuàng)建一個,應(yīng)用了更改的新視圖 —— 我們不僅僅是修改現(xiàn)有的視圖。

[[414805]]

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

每當我們將修飾符應(yīng)用于 SwiftUI 視圖時,我們實際上都會創(chuàng)建一個,應(yīng)用了更改的新視圖 —— 我們不僅僅是修改現(xiàn)有的視圖。 如果你仔細想想,這種行為是有道理的 —— 我們的視圖僅保留我們賦予它們的確切屬性,因此,如果我們設(shè)置背景顏色或字體大小,則無處存儲該數(shù)據(jù)。

我們將在下一章中查看為什么會發(fā)生這種情況,但是首先,我想看看這種行為的實際含義??匆幌逻@段代碼:

  1. Button("Hello World") { 
  2.     // do nothing 
  3. }     
  4. .background(Color.red) 
  5. .frame(width: 200, height: 200) 

您認為它運行時會是什么樣?

您很可能猜錯了:您不會在中間看到帶有 “Hello World” 的 200x200 紅色按鈕。相反,您會看到一個 200x200 的空正方形,中間是 “Hello World”,在 “Hello World” 周圍有一個紅色矩形。

如果思考一下修飾符的工作原理,您就可以了解為什么會如此:每個修飾符都會創(chuàng)建一個,應(yīng)用了該修飾符的新結(jié)構(gòu)體,而不是在視圖上設(shè)置屬性。

您可以通過查詢視圖主體的類型來窺視 SwiftUI 的底層。將按鈕修改為如下:

  1. Button("Hello World") { 
  2.     print(type(of: self.body)) 
  3. }     
  4. .background(Color.red) 
  5. .frame(width: 200, height: 200) 

Swift 的 type(of:) 方法會打印特定值的確切類型,在這種情況下,它將打印以下內(nèi)容:ModifiedContent

您可以在這里看到兩件事:

  • 每次我們修改視圖時,SwiftUI 都會使用以下泛型來應(yīng)用該修飾符:ModifiedContent
  • 當我們應(yīng)用多個修飾符時,它們會疊加在一起:ModifiedContent

要了解該類型是什么,請從最里面的類型開始,然后逐步解決:

  • 最里面的類型是 ModifiedContent
  • 在外部,我們有了 ModifiedContent<…, _FrameLayout> ,它使用了我們的第一個視圖(按鈕+背景色),并為其提供了 Frame。

如您所見,我們使用 ModifiedContent 類型堆疊——每個視圖都需要一個視圖進行轉(zhuǎn)換以及要進行的實際更改,而不是直接修改視圖。

這意味著修飾符的順序很重要。 如果我們重寫代碼以便在設(shè)置 Frame 后使用背景色,那么您就會得到預(yù)期的結(jié)果:

  1. Button("Hello World") { 
  2.     print(type(of: self.body)) 
  3. .frame(width: 200, height: 200) 
  4. .background(Color.red) 

現(xiàn)在最好的思考方法是,想象一下 SwiftUI 在每個修飾符之后都會呈現(xiàn)您的視圖。因此,只要您說 .background(Color.red),它就會將背景顏色變?yōu)榧t色,而不管您給它什么 Frame。如果您之后再擴展 Frame,它將不會重新加載因為背景已經(jīng)被使用了。

當然,這不是 SwiftUI 實際上的工作方式,因為如果這樣做,那將是性能上的噩夢,但這是學(xué)習的時候可以使用的一種簡潔的思維捷徑。

使用修飾符的一個重要副作用是,我們可以多次應(yīng)用相同的效果:每個修飾符都會簡單地添加到以前的內(nèi)容中。

例如,SwiftUI 為我們提供了 padding() 修飾符,該修飾符在視圖周圍添加了一些空間,從而不會將其推到其他視圖或屏幕邊緣。如果我們應(yīng)用填充,然后應(yīng)用背景色,然后應(yīng)用更多填充和不同的背景色,則可以為視圖提供多個邊框,如下所示:

  1. Text("Hello World"
  2.     .padding() 
  3.     .background(Color.red) 
  4.     .padding() 
  5.     .background(Color.blue) 
  6.     .padding() 
  7.     .background(Color.green) 
  8.     .padding() 
  9.     .background(Color.yellow) 

譯自 Why modifier order matters[1]

參考資料

[1]Why modifier order matters: https://www.hackingwithswift.com/books/ios-swiftui/why-modifier-order-matters

 

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

2023-12-29 09:01:27

SwiftUI視圖修飾符

2009-08-24 16:49:39

C#修飾符

2023-02-13 11:06:58

決策智能數(shù)據(jù)分析

2024-01-08 13:28:00

5G低延遲

2022-01-10 23:39:18

Java測試開發(fā)

2022-11-07 11:22:33

2023-05-23 16:08:19

2022-08-24 15:03:21

數(shù)據(jù)智能數(shù)據(jù)分析

2022-05-11 15:08:16

加密貨幣私鑰安全

2013-01-08 14:58:48

Firefox OS

2015-10-19 17:57:33

容器OpenStack微服務(wù)

2018-10-25 15:20:17

區(qū)塊鏈去中心化互聯(lián)網(wǎng)

2010-10-26 13:44:15

2022-12-29 10:16:12

觀察性系統(tǒng)監(jiān)視

2022-11-15 14:52:09

虛擬孿生數(shù)字孿生

2024-04-22 15:31:02

物聯(lián)網(wǎng)

2018-07-13 08:59:32

備份歸檔差異

2020-08-11 11:51:47

標準物聯(lián)網(wǎng)IOT

2022-01-06 22:05:35

Linux物聯(lián)網(wǎng)容器

2022-05-19 16:40:16

工業(yè)物聯(lián)網(wǎng)設(shè)備工業(yè)自動化
點贊
收藏

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