SwiftUI 的 @AppStorage
預設會存在 UserDefaults.standard
,而如果不想存在預設的 UserDefaults,也能指定要存在別的 UserDefaults。
SwiftUI 的 AppStorage
@AppStorage
是 SwiftUI 用來永久儲存資料的 Property Wrapper,如果我們希望某筆資料在關閉 App 後再打開仍存在的話,就可以使用 AppStorage 來存資料。
備註
SwiftUI 的 AppStorage 通常用來儲存簡單且少量的資料,如果想存較複雜或是較多筆同類型的資料時,就不適合使用 AppStorage。
AppStorage 的使用方式如下:
@AppStorage("showHints") private var showHints = true
在一個變數前,用關鍵字「@AppStorage
」來裝飾,並給予一個唯一的 key 值,如此,showHints 的值就算 App 被滑掉關閉後,再次打開,它的值仍還會在。
SwiftUI 的 AppStorage 預設存在 UserDefaults.standard
當我們像上面那樣,定義了一個 AppStorage 的變數時,它的值預設會存在預設的資料庫 UserDefaults.standard 中,但在大多數的情況下,這已經能符合我們的需求了,也不需要特別設定存到別的 UserDefaults 資料庫中。
不過如果我們有特別的需求,或是有使用到 App Groups 的技術,要在不同的 Targets 之間存取同一個 UserDefaults database 時,也能特別指定,像上面使用 AppStorage 的範例,可以寫的複雜一點,特別指定要存在 standard 的 UserDefaults,像這樣:
@AppStorage("showHints", store: UserDefaults.standard) private var showHints = true
而如果要指定別的 UserDefaults 的話,會像這樣:
@AppStorage("showHints", store: UserDefaults(suiteName: "group.xcodeproject.example")) private var showHints = true
一次指定所有 AppStorage 要存的 UserDefaults 資料庫
假設一開始,我們的專案並沒有使用到 App Groups 的技術,所以也不需要特別指定 AppStorage 要存的 UserDefaults database,使用 standard 就能執行得好好的了。
但某一天,當我們有新的需求,要開始納入 App Groups 的技術了,就會發現,整個專案裡有很多地方都使用了 @AppStorage,而如果要替所有的 AppStorage 都幫它們加上 store
參數指定到別的 UserDefaults database 的話,會很累,程式有很多地方要改。
這時候就能使用 Scene Modifier「defaultAppStorage(_:)
」來一次指定某個 Scene 之下的所有 AppStorage 預設要存在哪個 UserDefaults database。
@main
struct Example: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.defaultAppStorage(UserDefaults(suiteName: "group.xcodeproject.example"))
}
}
如此,ContentView 裡面所用到的所有 AppStorage 都會被指定預設要存在 Suite Name 為「group.xcodeproject.example」的 UserDefaults 資料庫中,除非有某個 AppStorage 自己特別寫了 store 參數指定到別的 UserDefaults 資料庫,那它則會存在它自己所指定的資料庫中。
關於 XcodeProject
XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。