SwiftUI

2024 年 5 月 26 日

SwiftUI 設定 AppStorage 要存在哪個 UserDefaults

已複製到剪貼板


SwiftUI 的 @AppStorage 預設會存在 UserDefaults.standard,而如果不想存在預設的 UserDefaults,也能指定要存在別的 UserDefaults。

SwiftUI @AppStorage
SwiftUI @AppStorage

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 資料庫,那它則會存在它自己所指定的資料庫中。

分享文章

已複製到剪貼板

主題文章

查看 SwiftUI

超級感謝

關於 XcodeProject

XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。


Contacts

Ricky Chuang

XcodeProject

RickyChuang.xcodeproj@gmail.com

XcodeProject 聯絡

contact.xcodeproj@gmail.com

最新文章