SwiftData @Model и ModelContext
Определяйте модели с помощью макроса @Model и выполняйте операции CRUD через ModelContext.
«SwiftData @Model и ModelContext» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Введение в SwiftData
SwiftData (iOS 17 и новее) — это современный нативный для Swift фреймворк Apple для сохранения данных, созданный поверх Core Data.
import SwiftData
// Main concepts: @Model, ModelContainer, ModelContextМакрос @Model
Добавьте к классу аннотацию @Model, чтобы превратить его в сохраняемую модель SwiftData. Свойства автоматически становятся сохраняемыми атрибутами.
@Model
class Item {
var name: String
var createdAt: Date
init(name: String) {
self.name = name
self.createdAt = Date()
}
}Настройка ModelContainer
Создайте ModelContainer с типами моделей и внедрите его в окружение SwiftUI.
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(for: Item.self)
}
}ModelContext в представлениях
Используйте @Environment(\.modelContext), чтобы получить доступ к контексту модели в представлении SwiftUI.
struct AddItemView: View {
@Environment(\.modelContext) private var context
func addItem() {
context.insert(Item(name: "New Item"))
}
}Вставка и удаление
Вызовите context.insert, чтобы добавить модель, и context.delete, чтобы удалить её. По умолчанию изменения сохраняются автоматически.
let item = Item(name: "Coffee")
context.insert(item) // add
context.delete(item) // remove
// Auto-saved on next run loop@Query для получения данных
@Query в представлениях SwiftUI автоматически получает данные и обновляет представление при изменении исходных данных.
struct ItemList: View {
@Query(sort: \Item.createdAt, order: .reverse) var items: [Item]
var body: some View {
List(items) { item in Text(item.name) }
}
}Фильтрация с помощью предикатов
Передайте #Predicate в @Query, чтобы декларативно отфильтровать результаты.
@Query(filter: #Predicate<Item> { $0.name.contains("Swift") })
var swiftItems: [Item]Ручное сохранение
Вызовите try context.save(), если нужен явный контроль над моментом сохранения изменений.
do {
try context.save()
} catch {
print("Save error: \(error)")
}@Attribute для настройки
Используйте @Attribute для свойств, чтобы настроить поведение сохранения (например, уникальность или внешнее хранилище).
@Model
class User {
@Attribute(.unique) var email: String
@Attribute(.externalStorage) var avatar: Data?
init(email: String) { self.email = email }
}Свойства @Transient
Пометьте свойства с помощью @Transient, чтобы исключить их из сохранения.
@Model
class Session {
var token: String
@Transient var isExpired: Bool = false
init(token: String) { self.token = token }
}Настройка ModelContainer
Настройте контейнер с явной схемой и планом миграции для версионируемых моделей.
let schema = Schema([Item.self, User.self])
let config = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
let container = try ModelContainer(for: schema, configurations: config)Быстрая проверка
Какая оболочка свойств SwiftUI автоматически получает модели SwiftData и обновляет представление при изменении данных?
Итоги урока
Добавляйте к классам аннотацию @Model, чтобы сделать их сохраняемыми. Настройте ModelContainer на уровне приложения. Читайте и записывайте данные через @Environment(\.modelContext). Реактивно получайте данные с помощью @Query. Фильтруйте их с помощью #Predicate.
Часто задаваемые вопросы
Урок «SwiftData @Model и ModelContext» бесплатный?
Да — полный текст урока «SwiftData @Model и ModelContext» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «SwiftData @Model и ModelContext»?
Определяйте модели с помощью макроса @Model и выполняйте операции CRUD через ModelContext. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «SwiftData @Model и ModelContext»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Стек Core Data: настройка NSPersistentContainer
- SwiftData @Model и ModelContext
- Связи и дескрипторы выборки
- Облегчённые миграции и синхронизация CloudKit