iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
Mobile Development

SwiftUI學習之旅系列 第 15

Day 15:Property Wrapper(2)

  • 分享至 

  • xImage
  •  

昨天介紹了 Property Wrapper 和 @State 之後,今天要來介紹另外兩個 Property Wrapper,分別是在介紹 @State 時有提到的 @Binding 和 @Environment。

@Binding

首先來介紹 @Binding,@Binding 通常這是用來傳遞對一個 value type 資料做修改的方法。

而 @Binding 內包含兩個閉包,分別是:

get: () -> Value
set: (Value) -> Void

get 的話,它會回傳一個 value,另一個 set 是需要提供一個 value 給它,然後會對這個 value 進行一些操作,可以發現 @Binding 是一個可以傳遞的計算屬性。

而在 SwiftUI 中,有些元件的操作需要使用到 @Binding,舉個例子,像是 TextField、Toggle 等。這些元件在使用時需要一個變數跟元件綁定再一起,這樣才能取的元件的值。

以 TextField 為例:

還記得上一篇提到的 @State 嗎?@State 的 $ 符號的屬性恰好是 @Binding,所以這裡就能使用這個類型,搭配上 @State 的效果,可以完成改變值得同時改變畫面。

@Enviornment

接下來介紹的是 @Enviornment,可以把它當成是一個環境變數,會在 App 啟動時設定好,也能在它的值有更新時,自動通知有關聯的畫面一起做更新。

還有 @Environment 有個特性就是只能 get,不能 set。

不過我們還是能透過 .environment 這個 modifier 來覆蓋原有的值,注意,這裡說的是覆蓋,不是改變,兩者有什麼差別呢?還記得之前介紹 modifier 時有提到的特性吧,這裡同理。

而 @Environment 的啟動方式是放入一個 EnvironmentValues 的 Keypath,是不是不太能理解,其實就是在 Apple 提供的 EnvironmentValues 找到你要的那個的 Keypath 就好,具體就像下圖中那樣。

然後來介紹一下我最常用的 @Environment,就是這個 dismiss,這個 dismiss 主要的功能也就是關閉彈出視窗,用法也還算簡單,在想要觸發的地方打上 dismiss() 就好,不過這部分還是自己去實作一次看看比較好瞭解。

那今天的部分就介紹到這裡,明天來提一下資料持久化吧。


上一篇
Day 14:Property Wrapper(1)
下一篇
Day 16:資料持久化(1)
系列文
SwiftUI學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言