فهرست سرفصل‌های Swift
خانه (Swift HOME) معرفی (Swift Intro) شروع به کار (Swift Get Started) سینتکس (Swift Syntax) دستورات (Swift Statements) خروجی (Swift Output) چاپ اعداد (Print Numbers) کامنت ها (Swift Comments) متغیرها (Swift Variables) چاپ متغیرها (Print Variables) چند متغیره (Multiple Variables) شناسه ها (Identifiers) ثابت ها (Constants) نمونه های دنیای واقعی (Real-Life Examples) انواع داده (Swift Data Types) اعداد (Numbers) بولی ها (Booleans) کاراکترها (Characters) تبدیل نوع (Swift Type Casting) عملگرها (Swift Operators) عملگرهای حسابی (Arithmetic Operators) عملگرهای انتساب (Assignment Operators) عملگرهای مقایسه ای (Comparison Operators) عملگرهای منطقی (Logical Operators) اولویت عملگرها (Operator Precedence) رشته ها (Swift Strings) اتصال رشته ها (Concatenation) اعداد و رشته ها (Numbers and Strings) کاراکترهای ویژه (Special Characters) یونیکد و اسکالرها (Unicode & Scalars) آرایه ها (Swift Arrays) حلقه روی آرایه (Loop Through an Array) برش های آرایه (Array Slices) اندیس ها و کران ها (Indices & Bounds) آرایه های چندبعدی (Multidimensional Arrays) نمونه های دنیای واقعی (Real-Life Examples) بازه ها (Swift Ranges) اگر...وگرنه (Swift If...Else) if (if) else (else) else if (else if) اگر...وگرنه کوتاه (Short Hand If...Else) if تو در تو (Nested If) عملگرهای منطقی (Logical Operators) نمونه های دنیای واقعی (Real-Life Examples) سوئیچ (Swift Switch) حلقه while (Swift While Loop) حلقه repeat/while (Repeat/While Loop) نمونه های دنیای واقعی (Real-Life Examples) حلقه for (Swift For Loop) حلقه های تو در تو (Nested Loops) حلقه for-each (For-Each Loop) نمونه های دنیای واقعی (Real-Life Examples) شکستن/ادامه (Swift Break/Continue) کالکشن ها (Swift Collections) ست ها (Sets) دیکشنری ها (Dictionaries) map، filter، reduce (map, filter, reduce) مرتب سازی (Sorting) تغییرپذیری (let دربرابر var) (Mutability (let vs var)) پروتکل های کالکشن (Collection Protocols) توابع (Swift Functions) اختیاری ها (Swift Optionals) enumها و الگوها (Swift Enums & Patterns) Closureها (Swift Closures) تاپل ها و نام های مستعار نوع (Tuples & Type Aliases) برنامه نویسی شیءگرا (Swift OOP) کلاس ها/اشیا (Classes/Objects) ساختارها (Structs) کلاس vs ساختار (Class vs Struct) ویژگی های کلاس (Class Properties) متدهای کلاس (Class Methods) کلیدواژه self (self Keyword) ارث بری (Swift Inheritance) چندریختی (Swift Polymorphism) پروتکل ها (Swift Protocols) جنریک ها (Swift Generics) اکستنشن ها (Swift Extensions) کنترل دسترسی (Access Control) سازنده ها (Initializers) مخرب ها (Deinitializers) معنای مقداری و COW (Value Semantics & COW) Equatable و Comparable (Equatable & Comparable) مدیریت خطا (Swift Error Handling) هم روندی (Swift Concurrency) حافظه (Swift Memory) مدیر بسته سوئیفت (Swift Package Manager) معرفی SwiftUI (SwiftUI Intro) راه اندازی پروژه iOS (iOS Project Setup) چیدمان SwiftUI (SwiftUI Layout) HStack VStack ZStack (HStack VStack ZStack) اسپیسر و ترازبندی (Spacers & Alignment) فریم و پدینگ (Frames & Padding) گریدها (Grids) GeometryReader (GeometryReader) ناحیه امن (Safe Area) استک های تنبل (Lazy Stacks) ناوبری SwiftUI (SwiftUI Navigation) NavigationStack (NavigationStack) NavigationLink (NavigationLink) TabView (TabView) شیت ها و پاپ اورها (Sheets & Popovers) دیپ لینک ها (Deep Links) ناوبری برنامه ای (Programmatic Nav) navigationDestination (navigationDestination) نوار ابزار و آیتم ها (Toolbar & Bar Items) جریان داده در SwiftUI (SwiftUI Data Flow) @State (@State) @Binding (@Binding) @ObservedObject & @StateObject (@ObservedObject & @StateObject) @EnvironmentObject (@EnvironmentObject) @Environment (Values) (@Environment (Values)) لیست ها و فرم ها در SwiftUI (SwiftUI Lists & Forms) List (List) ForEach (ForEach) Section (Section) Form (Form) TextField/Toggle/Picker (TextField/Toggle/Picker) Swipe Actions (Swipe Actions) Edit Mode (Edit Mode) List Styles (List Styles) انیمیشن ها در SwiftUI (SwiftUI Animations) انیمیشن های ضمنی (Implicit Animations) انیمیشن های صریح (Explicit Animations) ترنزیشن ها (Transitions) MatchedGeometryEffect (MatchedGeometryEffect) انیمیشن های فنری (Spring Animations) منحنی های انیمیشن (Animation Curves) ژست ها در SwiftUI (SwiftUI Gestures) TapGesture (TapGesture) LongPressGesture (LongPressGesture) DragGesture (DragGesture) ترکیب ژست ها (Composing Gestures) MagnificationGesture (MagnificationGesture) RotationGesture (RotationGesture) Modifierها و ViewBuilder (SwiftUI Modifiers & ViewBuilder) مودیفایرها (Modifiers) ViewBuilder (ViewBuilder) مودیفایرهای سفارشی (Custom Modifiers) پیش نمایش ها (SwiftUI Previews) گونه ها و وضعیت ها (Variants & States) حالت روشن/تیره (Light/Dark Mode) دسترس پذیری در SwiftUI (SwiftUI Accessibility) برچسب ها و عمل ها (Labels & Actions) سایز پویا (Dynamic Type) فوکوس و VoiceOver (Focus & VoiceOver) استایل دهی و تم دهی در SwiftUI (SwiftUI Styling & Theming) طرح های رنگی (Color Schemes) متریال ها (Materials) تم دهی (Theming) شبکه سازی (Networking) ماندگاری (Persistence) ماندگاری (Core Data) (Persistence (Core Data)) معماری MVVM (MVVM Architecture) AppStorage و SceneStorage (AppStorage & SceneStorage) تست SwiftUI (Testing SwiftUI) حریم خصوصی و مجوزها (Privacy & Permissions) اعلان های پوش (Push Notifications) ویجت ها و اکستنشن ها (Widgets & Extensions) کار در پس زمینه (Background Work) Core Location (Core Location) App Clips (App Clips) مبانی Keychain (Keychain Basics) CloudKit (CloudKit) سیستم فایل (File System) URLSession پس زمینه (Background URLSession) MapKit (MapKit) بومی سازی (Localization) دسترس پذیری (Accessibility) حریم خصوصی اپ (App Privacy) خرید درون برنامه ای (In-App Purchases) آنالیتیکس و گزارش گیری (Analytics & Reporting) تست با XCTest (Testing with XCTest) دارایی ها و آیکون ها (Assets & App Icons) امضا و انتشار (Signing & Distribution) TestFlight و App Store (TestFlight & App Store) انتشار اولین اپ (Ship Your First App) تمارین (Swift Exercises) کوییز (Swift Quiz)
نتیجه‌ای برای جستجو یافت نشد.
Swift

Swift — ماندگاری (Core Data) (Persistence (Core Data))

آخرین بروزرسانی: 1404/08/15

ماندگاری (Core Data) (Persistence (Core Data))

اینجا «ماندگاری با Core Data» را یاد می گیری. «Core Data» چارچوب ماندگاری شی گراست. داده ها و رابطه ها را مدیریت می کند. سپس تغییرات را دنبال می کند. گاهی زیرساخت از SQLite استفاده می کند. این یعنی ذخیره سازی مطمئن و مقیاس پذیر.

Core Data چیست؟

«Core Data» چارچوب شی گرا برای مدل، ذخیره و کوئری است. بنابراین مدل ها و رابطه ها سامان می گیرند. سپس تغییرات رصد می شوند. اغلب پشت صحنه SQLite قرار دارد.

راه اندازی پایه با NSPersistentContainer

می توانی از هنگام ساخت پروژه، Core Data را فعال کنی. یا یک «NSPersistentContainer» بسازی. سپس «viewContext» را به SwiftUI بدهی با «.environment(\.managedObjectContext)».

import SwiftUI
import CoreData

@objc(Note)
class Note: NSManagedObject {
  @NSManaged var title: String?
}

extension Note {
  @nonobjc
  class func fetchRequest() -> NSFetchRequest<Note> {
    return NSFetchRequest<Note>(entityName: "Note")
  }
}

struct PersistenceController {
  static let shared: PersistenceController = PersistenceController()
  let container: NSPersistentContainer
  init() {
    let model: NSManagedObjectModel = NSManagedObjectModel()
    let entity: NSEntityDescription = NSEntityDescription()
    entity.name = "Note"
    entity.managedObjectClassName = NSStringFromClass(Note.self)
    let title: NSAttributeDescription = NSAttributeDescription()
    title.name = "title"
    title.attributeType = .stringAttributeType
    title.isOptional = true
    entity.properties = [title]
    model.entities = [entity]

    container = NSPersistentContainer(name: "MyModel", managedObjectModel: model)
    let description: NSPersistentStoreDescription = NSPersistentStoreDescription()
    description.type = NSInMemoryStoreType
    container.persistentStoreDescriptions = [description]
    container.loadPersistentStores { _, error in
      if let error {
        fatalError("Unresolved error: \(error)")
      }
    }
  }
}

struct BasicCoreDataView: View {
  @Environment(\.managedObjectContext) private var context: NSManagedObjectContext
  @FetchRequest(sortDescriptors: []) private var items: FetchedResults<Note>

  var body: some View {
    List(items, id: \.objectID) { note in
      Text(note.title ?? "")
    }
    .toolbar {
      Button("Add") {
        add()
      }
    }
  }

  private func add() {
    let i: Note = Note(context: context)
    i.title = "New"
    try? context.save()
  }
}

مشاهده در ادیتور

import SwiftUI

struct ContentView: View {
  var body: some View {
    BasicCoreDataView()
  }
}

مشاهده در ادیتور

import SwiftUI
import CoreData

@main
struct MyApp: App {
  let persistence: PersistenceController = PersistenceController.shared
  var body: some Scene {
    WindowGroup {
      ContentView()
        .environment(\.managedObjectContext, persistence.container.viewContext)
    }
  }
}

مشاهده در ادیتور

جمع بندی راه اندازی

  1. Container را بساز و بارگذاری کن.
  2. Context را به محیط View بده.
  3. با FetchRequest لیست را پر کن.

نکته: اگر مدل زیاد است، فایل «.xcdatamodeld» بساز. سپس موجودیت ها را آنجا تعریف کن.

نمونه Notes با FetchRequest

اکنون یک View ساده می سازیم. سپس با «FetchRequest» یادداشت ها را می خوانیم. این کار الگوی اصلی بسیاری از اپ هاست.

import SwiftUI
import CoreData

class NoteEntity: NSManagedObject {
  @NSManaged public var id: UUID?
  @NSManaged public var title: String?
  @NSManaged public var body: String?
}

extension NoteEntity: Identifiable {}

struct PersistenceController {
  static let shared: PersistenceController = PersistenceController()
  let container: NSPersistentContainer
  init() {
    container = NSPersistentContainer(name: "MyModel")
    container.loadPersistentStores { _, error in
      if let error {
        fatalError("Unresolved error: \(error)")
      }
    }
  }
}

struct NotesCoreDataView: View {
  @Environment(\.managedObjectContext) private var context: NSManagedObjectContext
  @FetchRequest(
    sortDescriptors: [
      NSSortDescriptor(keyPath: \NoteEntity.title, ascending: true)
    ]
  )
  private var notes: FetchedResults<NoteEntity>

  var body: some View {
    List(notes) { n in
      VStack(alignment: .leading) {
        Text(n.title ?? "Untitled").font(.headline)
        Text(n.body ?? "").font(.subheadline)
      }
    }
    .toolbar {
      Button("Add") {
        add()
      }
    }
  }

  private func add() {
    let n: NoteEntity = NoteEntity(context: context)
    n.id = UUID()
    n.title = "New Note"
    n.body = ""
    try? context.save()
  }
}

مشاهده در ادیتور

import SwiftUI

struct ContentView: View {
  var body: some View {
    NotesCoreDataView()
  }
}

مشاهده در ادیتور

import SwiftUI
import CoreData

@main
struct MyApp: App {
  let persistence: PersistenceController = PersistenceController.shared
  var body: some Scene {
    WindowGroup {
      ContentView()
        .environment(\.managedObjectContext, persistence.container.viewContext)
    }
  }
}

مشاهده در ادیتور

اشتراک Store با App Group

می توانی فایل SQLite را در App Group بگذاری. سپس ویجت همان داده را می خواند. بنابراین تجربه یکپارچه می گیری.

import SwiftUI
import CoreData

struct PersistenceController {
  static let shared: PersistenceController = PersistenceController()
  let container: NSPersistentContainer
  init() {
    container = NSPersistentContainer(name: "MyModel")
    if let groupURL: URL = FileManager.default.containerURL(
      forSecurityApplicationGroupIdentifier: "group.com.example.notes"
    ) {
      let storeURL: URL = groupURL.appendingPathComponent("MyModel.sqlite")
      let description: NSPersistentStoreDescription = NSPersistentStoreDescription(url: storeURL)
      container.persistentStoreDescriptions = [description]
    }
    container.loadPersistentStores { _, error in
      if let error {
        fatalError("Unresolved error: \(error)")
      }
    }
  }
}

struct AppGroupListView: View {
  @Environment(\.managedObjectContext) private var context: NSManagedObjectContext
  @FetchRequest(sortDescriptors: []) private var items: FetchedResults<Item>

  var body: some View {
    List(items) { item in
      Text(item.title ?? "")
    }
    .toolbar {
      Button("Add") {
        add()
      }
    }
  }

  private func add() {
    let i: Item = Item(context: context)
    i.title = "Shared Item"
    try? context.save()
  }
}

مشاهده در ادیتور

import SwiftUI

struct ContentView: View {
  var body: some View {
    AppGroupListView()
  }
}

مشاهده در ادیتور

import SwiftUI
import CoreData

@main
struct MyApp: App {
  let persistence: PersistenceController = PersistenceController.shared
  var body: some Scene {
    WindowGroup {
      ContentView()
        .environment(\.managedObjectContext, persistence.container.viewContext)
    }
  }
}

مشاهده در ادیتور

نکته: کارهای سنگین را از «viewContext» دور نگه دار. برای ایمپورت از کانتکست پس زمینه استفاده کن.

جمع بندی سریع

  • Container را بساز و Context را تزریق کن.
  • با FetchRequest داده ها را بخوان.
  • ذخیره سازی می تواند مشترک باشد.
  • پس زمینه برای کار سنگین بهتر است.

ادامه مسیر: UserDefaults برای تنظیمات سبک. سپس الگوی MVVM برای جداسازی بهتر. همچنین ماندگاری با Core Data را به عنوان مرجع نگه دار.