Published on

SwiftData ga kirish

Authors

Butun ob'ektlar to'plamini saqlash kerak bo'lsa β€” vazifalar ilovasi, jurnal yozuvlari, saqlangan retseptlar β€” fayl saqlash noqulayroq bo'lib qoladi. Har bir o'zgarishda butun massivni o'qib yozib yurish kerak, filtrlash esa hamma narsani xotiraga yuklashni talab qiladi.

Bu erda SwiftData kerak bo'ladi. SwiftData β€” Apple ning zamonaviy tuzilgan ma'lumot saqlash freymvorki. Siz Swift klasslari yordamida ma'lumot modelingizni tasvirlab, @Model makrosini qo'shasiz β€” SwiftData qolganini bajaradi: ma'lumot bazasini yaratadi, yozuvlarni yozadi, o'qiydi va viewlaringizni yangilangan saqlab turadi.

@Model β€” model yaratish

import SwiftData
import SwiftUI

// @Model bu sinfni SwiftData modeli sifatida belgilaydi
// Barcha persistenslik kodini avtomatik yaratadi
@Model
class VazifaElement {
    // Har bir xususiyat ma'lumot bazasidagi ustun bo'ladi
    var sarlavha: String
    var bajarildi: Bool
    // Date.now yaratilish vaqtini avtomatik o'rnatadi
    var yaratilganVaqt: Date

    // Yangi VazifaElement namunasini sozlash
    init(sarlavha: String) {
        self.sarlavha = sarlavha
        self.bajarildi = false
        self.yaratilganVaqt = .now
    }
}

.modelContainer β€” ilovaga bog'lash

@main
struct VazifaIlovasi: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        // VazifaElement ni konteyner bilan ro'yxatdan o'tkazadi
        // Ilova ildizida bir marta qo'shiladi
        .modelContainer(for: VazifaElement.self)
    }
}

ModelContext β€” yozish uchun

struct BaziKorinish: View {
    // @Environment .modelContainer tomonidan ta'minlangan ModelContext ni injeksiya qiladi
    @Environment(\.modelContext) private var modelContext

    var body: some View {
        Button("Vazifa qo'shish") {
            // Yangi VazifaElement yaratib ma'lumot bazasiga qo'shamiz
            let vazifa = VazifaElement(sarlavha: "Oziq-ovqat sotib olish")
            modelContext.insert(vazifa)
        }
    }
}
QatorVazifasi
@ModelSwift makrosi β€” SwiftData ga kerak bo'lgan barcha persistenslik kodini yaratadi. Bu belgisiz SwiftData sinfingiz haqida bilmaydi.
class VazifaElementSwiftData modellari class bo'lishi shart, struct emas. SwiftData ob'ektlardagi vaqt davomidagi o'zgarishlarni kuzatadi β€” bu classlar qo'llab-quvvatlaydi, struct lar emas.
.modelContainer(for: VazifaElement.self)Ilovaga ma'lumot bazasi konteynerini bog'laydi. Konteyner haqiqiy ma'lumot bazasi faylini boshqaradi. Bu quyidagi barcha viewlar undan foydalana olishi uchun ildizda qilinadi.
@Environment(\.modelContext) private var modelContextFaol yozish kontekstini ko'rinishga injeksiya qiladi. Siz yozuvlarni modelContext orqali qo'shasiz va o'chirasiz.
modelContext.insert(vazifa)Yangi model ob'ektini ma'lumot bazasiga qo'shadi.

SwiftData asosiy tushunchalari

// Bir necha modelni ro'yxatdan o'tkazish
.modelContainer(for: [VazifaElement.self, JurnalYozuvi.self])

// Xotiradagi konteyner β€” Preview va test uchun
// inMemory: true ma'lumot diskka yozilmasligini ta'minlaydi
.modelContainer(for: VazifaElement.self, inMemory: true)
// modelContext.delete() β€” yozuvni o'chirish
func ochirishIshlovi(offsets: IndexSet) {
    for index in offsets {
        modelContext.delete(vazifalar[index])
    }
}

Tezkor ma'lumotnoma

SintaksisVazifasi
@Model class MeningSinfim { }Sinfni SwiftData doimiy modeli sifatida belgilaydi
.modelContainer(for: MeningSinfim.self)Ilovaga ma'lumot bazasi konteynerini bog'laydi β€” ildizda bir marta
.modelContainer(for: MeningSinfim.self, inMemory: true)Preview va testlar uchun xotira konteyneri
@Environment(\.modelContext) var modelContextKo'rinishga faol yozish kontekstini injeksiya qiladi
modelContext.insert(ob'ekt)Yangi model ob'ektini ma'lumot bazasiga qo'shadi
modelContext.delete(ob'ekt)Model ob'ektini ma'lumot bazasidan o'chiradi

🎯 Topshiriq: birinchi SwiftData modeli

Yangi Xcode loyihasi yarating va uchta xususiyatli @Model sinfini β€” Eslatma: sarlavha: String, mazmun: String, yaratilganVaqt: Date β€” aniqlang. Ilova kirish nuqtasiga .modelContainer(for: Eslatma.self) qo'shing. So'ngra sinov eslatmasini modelContext.insert orqali qo'shadigan tugma qo'shing. Ilova kompilyatsiya bo'lib, crash siz ishlatishini tasdiqlang β€” hali ro'yxat ko'rinishi yo'q, bu 9.5 darsda.

Buy mea coffee