使用 modelContainer
可以設定 SwiftUI Scene 中的 environment 變數「modelContext」。
modelContainer 概覽
比起 modelContext 來說,使用 modelContainer
來設定 SwiftUI Scene 的 model context 會是最簡單使用 SwiftData 的方式。不過它有兩個 Method 可以使用:
方法一:傳入一個 ModelContainer
@main
struct Example: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(container: ModelContainer)
}
}
方法二:傳入 any PersistentModel
@main
struct Example: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(for: any PersistentModel)
}
}
Init 一個 ModelContainer
方法一必須傳入一個 ModelContainer,就代表我們需要 init 它,這一段比較複雜,但跟使用 modelContext 的方法是一樣的,程式碼最終會長這樣:
.modelContainer(.init(
try! .init(
// 假設我們想儲存的 Swift class 叫做 DataModel
for: SwiftData.Schema([DataModel.self]),
configurations: [.init(isStoredInMemoryOnly: false)]
)
))
用 modelContainer 設定 SwiftData 的 model context
方法二是我們比較常會使用的 Method,傳入的 any PersistentModel 其實就是我們想儲存的 Swift class,這裡可以「只設定一個」或「一次設定多個」我們想儲存在 SwiftData 中的 Model。
只設定一個想儲存在 SwiftData 中的 Model
@main
struct Example: App {
var body: some Scene {
WindowGroup {
ContentView()
}
// 假設我們想儲存的 Swift class 叫做 DataModel
.modelContainer(for: DataModel.self)
}
}
一次設定多個想儲存在 SwiftData 中的 Model
@main
struct Example: App {
var body: some Scene {
WindowGroup {
ContentView()
}
// 如果有多個想儲存的 Swift class,可以直接傳 Array 進去
.modelContainer(for: [DataModel1.self, DataModel2.self])
}
}
討論
看到這裡,會覺得 modelContainer 很簡單,只要給型別就好。但其實 .modelContainer 這個 scene modifier 不只是這樣,它還有很多的參數可以傳入,只是因為都有預設值,我們不用特別設定。
完整的 modelContainer Scene Modifier
func modelContainer(
for modelTypes: any PersistentModel,
inMemory: Bool = false,
isAutosaveEnabled: Bool = true,
isUndoEnabled: Bool = false,
onSetup: @escaping (Result<ModelContainer, Error>) -> Void = { _ in }
) -> some Scene
modelTypes 說明
這裡就是我們上面設定想儲存 Swift class 的地方。
inMemory 說明
這裡可以設定我們的資料是不是只儲存在記憶體裡就好了,預設為 false,代表會儲存在硬碟裡,當 App 關掉再重開時資料也還會在。但如果這裡我們給 true,App 關掉資料就會被清理掉。
isAutosaveEnabled 說明
SwiftData 預設有自動儲存的功能,比起 Core Data 而言相當方便!使用上我們不需要主動地在資料處理完後 call .save()
,但如果我們不想要這個自動儲存的功能,可以在這個參數傳入 false。
isUndoEnabled 說明
SwiftData 比起 Core Data 更強大的地方還有 undo,也就是復原或上一步的功能。但這個功能預設是關閉的,我們可以在這裡傳入 true 來開啟 undo 的功能,並搭配 Environment 中的 undoManager 來操作還原或重做。
onSetup 說明
如果有看上一篇講解如何使用 modelContext 這個 scene modifier 的話,就會知道 init 一個 ModelContainer 是會 throws 的,但使用 .modelContainer 卻不用考慮這個,也不用 try catch,一開始看到時會覺得非常神奇,原來其實是它提供了一個預設什麼都不做的 callback,如果 Init 失敗那就失敗了,但我們就可以在這裡實作 create modelContainer 後要做的事,也能知道到底是成功或失敗。
關於 XcodeProject
XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。