成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SwiftUI 屬性包裝器如何處理結(jié)構(gòu)體

開發(fā) 后端
已經(jīng)了解了 SwiftUI 如何通過使用 @State 屬性包裝器將變化的數(shù)據(jù)存儲在結(jié)構(gòu)體中,如何使用 $ 將狀態(tài)綁定到UI控件的值,以及更改 @state 包裝的屬性時是如何自動讓 SwiftUI 重新調(diào)用我們的結(jié)構(gòu)體的 body屬性的。

[[436922]]

本文轉(zhuǎn)載自微信公眾號「網(wǎng)羅開發(fā)」,作者韋弦Zhy。轉(zhuǎn)載本文請聯(lián)系網(wǎng)羅開發(fā)公眾號。

已經(jīng)了解了 SwiftUI 如何通過使用 @State 屬性包裝器將變化的數(shù)據(jù)存儲在結(jié)構(gòu)體中,如何使用 $ 將狀態(tài)綁定到UI控件的值,以及更改 @state 包裝的屬性時是如何自動讓 SwiftUI 重新調(diào)用我們的結(jié)構(gòu)體的 body屬性的。

所有這些結(jié)合在一起,使我們可以編寫如下代碼:

  1. struct ContentView: View { 
  2.     @State private var blurAmount: CGFloat = 0 
  3.  
  4.     var body: some View { 
  5.         VStack { 
  6.             Text("Hello, World!"
  7.                 .blur(radius: blurAmount) 
  8.  
  9.             Slider(value: $blurAmount, in: 0...20) 
  10.         } 
  11.     } 

如果您執(zhí)行這些代碼,將會發(fā)現(xiàn)左右拖動滑塊可以完全按照預期調(diào)整文本標簽的模糊量。

現(xiàn)在,假設(shè)我們希望該綁定不僅僅是處理模糊效果的半徑。也許我們想將其保存到 UserDefaults 中,運行一個方法,或者只是打印出該值以進行調(diào)試。您可以嘗試像這樣更新屬性:

  1. @State private var blurAmount: CGFloat = 0 { 
  2.     didSet { 
  3.         print("New value is \(blurAmount)"
  4.     } 

如果您運行該代碼,您將感到失望:當您拖動滑塊周圍時,您會看到模糊量的變化,但是您不會看到我們的 print() 語句被觸發(fā)——實際上,什么都不會輸出。

為了了解這里發(fā)生的事情,我希望您考慮一下我們在使用 Core Data 時:我們使用 @FetchRequest 屬性包裝器查詢我們的數(shù)據(jù),但我還向您展示了如何直接使用 FetchRequest 結(jié)構(gòu)體,以便我們可以更好地控制它是如何創(chuàng)建的。

屬性包裝器具有該名稱,因為它們將我們的屬性包裝在另一個結(jié)構(gòu)體中。對于許多屬性包裝器而言,該結(jié)構(gòu)體與包裝器本身具有相同的名稱,但是使用 @FetchRequest 時我向您展示了我們實際上是如何實際讀取其中的包裝值——獲取的結(jié)果,而不是請求本身。

這意味著當我們使用 @State 來包裝字符串時,最終得到的實際屬性類型是 State。類似地,當我們使用 @Environment 和其他環(huán)境時,我們最終得到一個 Environment 類型的結(jié)構(gòu)體,該結(jié)構(gòu)體內(nèi)部包含一些其他值。

之前我曾解釋說,我們無法在視圖中修改屬性,因為它們是結(jié)構(gòu)體,因此是固定的。但是,現(xiàn)在您知道 @State 本身會生成一個結(jié)構(gòu)體,因此我們面臨一個難題:如何修改該結(jié)構(gòu)體?

Xcode 有一個非常有用的命令,稱為“快速打開”(使用 Cmd + Shift + O 進行訪問),該命令使您可以在項目或已導入的任何框架中找到任何文件或類型。現(xiàn)在將其激活,然后輸入 "State"——希望第一個結(jié)果在其下方顯示 SwiftUI,但如果沒有,請找到并選擇它。

您將進入 SwiftUI 生成的界面,該界面實質(zhì)上是 SwiftUI 向我們展示的所有的部分。那里沒有實現(xiàn)代碼,只有協(xié)議,結(jié)構(gòu)體,修飾符等的許多定義。

我們要求查看 state,因此您應(yīng)該被帶到此行:

  1. @propertyWrapper public struct State : DynamicProperty { 

該 @propertyWrapper 屬性使它成為 @State 供我們使用。

現(xiàn)在往下看幾行,您應(yīng)該看到以下內(nèi)容:

  1. public var wrappedValue: Value { get nonmutating set } 

該包裝值是我們要存儲的實際值,例如字符串。這個生成的接口告訴我們,該屬性可以讀取(get)和寫入(set),但是當我們設(shè)置該值時,它實際上不會更改結(jié)構(gòu)體本身。在后臺,它將值發(fā)送給SwiftUI以便存儲在可以自由修改的位置,因此,結(jié)構(gòu)體本身永不改變。

現(xiàn)在您已經(jīng)知道了所有這些,讓我們回到我們的問題代碼:

  1. @State private var blurAmount: CGFloat = 0 { 
  2.  
  3. didSet { 
  4.  
  5. print("New value is \(blurAmount)"
  6.  
  7.  

在表面上,狀態(tài)為“ 當blurAmount 更改時,打印出它的新值。”但是,由于 @State 實際上會包裝其內(nèi)容,因此實際上是說,當包裝 blurAmount 的 State 結(jié)構(gòu)體更改時,請打印出新的模糊量。

還在這兒?現(xiàn)在讓我們更進一步:您已經(jīng)看到 State 如何使用一個非可變的 setter 包裝其值,這意味著 blurAmount 或包裝它的 State 結(jié)構(gòu)體都沒有改變——我們的綁定直接改變了內(nèi)部存儲的值,這意味著屬性觀察者永遠不會被觸發(fā)。

那么我們該如何解決——我們?nèi)绾螌⒁恍┕δ芨郊拥桨b的屬性上?為此,我們需要自定義綁定——讓我們接下來看看...

> 譯自 How property wrappers become structs[1]

參考資料

[1]How property wrappers become structs: https://www.hackingwithswift.com/books/ios-swiftui/how-property-wrappers-become-structs

 

責任編輯:武曉燕 來源: 網(wǎng)羅開發(fā)
相關(guān)推薦

2021-07-29 18:48:32

Swift iOS macOS

2010-09-01 15:40:10

DHCP服務(wù)器

2010-08-31 19:48:25

DHCP服務(wù)器IP

2019-08-15 10:20:19

云計算技術(shù)安全

2020-11-24 12:10:22

瀏覽器前端斷網(wǎng)

2010-03-24 19:31:35

Nginx服務(wù)器

2017-10-26 08:43:18

JavaScript內(nèi)存處理

2019-12-23 10:20:12

Web圖片優(yōu)化前端

2021-03-01 07:31:53

消息支付高可用

2012-12-12 09:49:41

2020-12-29 09:11:33

LinuxLinux內(nèi)核

2017-03-13 13:21:34

Git處理大倉庫

2010-09-02 10:01:38

2018-09-21 09:03:34

windows服務(wù)器80端口

2011-04-29 09:56:13

一體機傳真件

2021-03-24 10:40:26

Python垃圾語言

2025-01-09 10:20:53

2023-01-04 10:01:21

ReactTypeScript元素

2024-04-16 13:32:57

2011-02-28 14:08:31

網(wǎng)速變慢局域網(wǎng)網(wǎng)速
點贊
收藏

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

主站蜘蛛池模板: 91精品国产乱码久久蜜臀 | 在线播放亚洲 | 91精品国产综合久久久久久蜜臀 | 北条麻妃国产九九九精品小说 | 欧美一区二不卡视频 | 国产综合第一页 | 成人欧美一区二区三区黑人孕妇 | 久久国产成人精品国产成人亚洲 | 国产精品一区二区免费 | 在线免费观看成年人视频 | 拍拍无遮挡人做人爱视频免费观看 | 三级黄色网址 | 91一区| 狠狠干2020 | 成人免费在线 | 成人小视频在线观看 | 一区二区三区网站 | 91精品国产91久久久 | 一区二区免费视频 | 午夜影院| 亚洲国产精品日韩av不卡在线 | 久久久久se| av天天看| 一区二区在线不卡 | 黄色在线免费观看 | 亚洲免费人成在线视频观看 | 九九在线视频 | 日韩精品1区2区3区 爱爱综合网 | 91影片| 在线看h| 亚洲高清在线观看 | 日韩在线视频一区二区三区 | 91国产精品在线 | 一区二区三区在线免费观看视频 | 中文字幕精品一区二区三区精品 | 国产在线麻豆精品入口 | 91在线一区 | 国产成人精品免费视频 | 国产高清在线视频 | 伊人91在线 | 欧美激情国产精品 |