0Pricing
Swift Academy · レッスン

SwiftDataの@ModelとModelContext

@Modelマクロでモデルを定義し、ModelContextを介してCRUDを実行します。

「SwiftDataの@ModelとModelContext」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

SwiftDataの概要

SwiftData(iOS 17以降)は、内部でCore Dataを基盤として動作する、Appleの最新のSwiftネイティブ永続化フレームワークです。

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

SwiftUIビューで@Queryを使用すると、基盤となるデータの変更時にモデルを自動的にフェッチして更新します。

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を使用して、永続化の動作(uniqueやexternal storageなど)をカスタマイズします。

@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)

確認問題

データの変更時にSwiftDataモデルを自動的にフェッチしてビューを更新するSwiftUIのプロパティラッパーはどれですか?

レッスンのまとめ

クラスに@Modelを付けて永続化可能にします。アプリレベルでModelContainerを設定します。@Environment(\.modelContext)で読み書きします。@Queryでリアクティブにフェッチし、#Predicateで絞り込みます。

よくある質問

「SwiftDataの@ModelとModelContext」レッスンは無料ですか?

はい。「SwiftDataの@ModelとModelContext」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「SwiftDataの@ModelとModelContext」で何を学びますか?

@Modelマクロでモデルを定義し、ModelContextを介してCRUDを実行します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「SwiftDataの@ModelとModelContext」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Core Dataスタック:NSPersistentContainerの設定
  2. SwiftDataの@ModelとModelContext
  3. リレーションシップとFetch Descriptor
  4. 軽量マイグレーションとCloudKit同期
← Swift Academyに戻る