在Swift
中,AppStorage
是SwiftUI
中引入的一個屬性包裝器,在這之前我們要存儲一些輕量級的數據采用UserDefaults
進行存取。而AppStorage
用于從UserDefaults
中讀取值,當值改變時,它會自動重新調用視圖的body
屬性。也就是說,這個AppStorage
包裝器有效地監視UserDefaults
中的鍵值,并在鍵值更改時刷新UI。
下面先看一個在SwiftUI
中使用UserDefaults
存儲的示例:
App第一運行時,沒有顯示userName
,當點擊SAVE后,userName
賦值,并通過UserDefaults
存起來。
當App第二個運行,在onAppear
方法中,讀取UserDefaults
存取的userName
值,賦值給userName
屬性并在UI上顯示。
struct AppStorageDemo: View {@State var userName: String?var body: some View {VStack(spacing: 30) {if let userName {Text(userName).font(.title)}Button(action: {userName = "Daniel"UserDefaults.standard.setValue(userName, forKey: "userName")}, label: {Text("SAVE").foregroundColor(.white).padding().background(Color.red).clipShape(Capsule())})}.onAppear {userName = UserDefaults.standard.string(forKey: "userName")}}
}
下面采用AppStorage
包裝器替換掉UserDefaults
的存儲邏輯。
上面代碼采用AppStorage
包裝器包裝userName
屬性,并在括號內設置了要監聽的key值,這表明userName
變量的值要通過這個key在UserDefaults
存儲。
@AppStorage("userName") var userName: String?
給userName
賦值,則將值直接存儲到UserDefaults
中。
讀取userName
的值,也是拿對應的key去UserDefaults
取值。
上面修改后的代碼在App運行起來后,顯示出了userName
的值,這說明AppStorage
包裝器在UserDefaults
通過userName
這個key讀取到了對應的值。
在文章開頭說的被AppStorage
包裝器包裝的屬性,在其改變的時候,UI會自動刷新,下面看一下下面的示例:
通過兩個Button
切換userName
的值,UI也及時的刷新了,通過再次啟動App,顯示也是上一次存儲的值。
以上就是AppStorage包裝器的簡單介紹與使用,如有不對的地方,還望大家批評指正。
最后,希望能夠幫助到有需要的朋友,如果您覺得有幫助,還望點個贊,添加個關注,筆者也會不斷地努力,寫出更多更好用的文章。