iOS 17/macOS 14から登場したSwiftData。その中核となる@Model
マクロについて、わかりやすく解説します。
@Modelマクロとは?
@Model
は、普通のSwiftクラスを「データを保存できるクラス」に変身させる魔法のようなマクロです。
従来、iOSアプリでデータを保存するにはCore Dataという仕組みを使う必要がありましたが、設定が複雑で初心者には難しいものでした。SwiftDataの@Model
マクロを使えば、たった1行追加するだけでデータの永続化が可能になります。
何ができるの?
@Model
を付けたクラスには、自動的に以下の機能が追加されます:
データの保存と読み込み アプリを閉じても、データがデータベースに保存され、次回起動時に復元できます。
変更の自動追跡 プロパティの値を変更すると、自動的にデータベースに反映されます。自分で保存処理を書く必要はありません。
他のデータとの関連付け 複数のモデル間で関係性を簡単に定義できます。例えば「著者」と「本」のような関係です。
実際に使ってみよう
例えば、読書管理アプリを作る場合、本の情報を保存するモデルはこんな感じで定義できます:
import SwiftData
@Model
class Book {
var title: String
var author: String
var publishedYear: Int
var isRead: Bool
init(title: String, author: String, publishedYear: Int, isRead: Bool = false) {
self.title = title
self.author = author
self.publishedYear = publishedYear
self.isRead = isRead
}
}
たったこれだけです!@Model
を付けるだけで、このクラスは自動的にデータベースに保存できるようになります。
より実践的な例:リレーションシップ
複数のモデルを関連付けることもできます。著者と本の関係を表現してみましょう:
@Model
class Author {
var name: String
var books: [Book]
init(name: String) {
self.name = name
self.books = []
}
}
@Model
class Book {
var title: String
var author: Author?
var publishedYear: Int
init(title: String, author: Author? = nil, publishedYear: Int) {
self.title = title
self.author = author
self.publishedYear = publishedYear
}
}
このように、普通のSwiftのプロパティとして関連を定義するだけで、データベース上でも正しく関係性が保存されます。
SwiftUIとの連携
SwiftDataの真価は、SwiftUIと組み合わせたときに発揮されます:
import SwiftUI
import SwiftData
struct BookListView: View {
@Query private var books: [Book]
@Environment(\.modelContext) private var modelContext
var body: some View {
List(books) { book in
VStack(alignment: .leading) {
Text(book.title)
.font(.headline)
Text(book.author)
.font(.subheadline)
}
}
.toolbar {
Button("追加") {
addBook()
}
}
}
func addBook() {
let newBook = Book(
title: "新しい本",
author: "著者名",
publishedYear: 2024
)
modelContext.insert(newBook)
}
}
@Query
を使うと、データベースから自動的にデータを取得し、変更があればUIも自動的に更新されます。
まとめ
@Model
マクロを使えば:
- シンプル: クラスに1行追加するだけ
- 自動化: 保存・読み込み・変更追跡が自動
- 型安全: Swiftの型システムがそのまま使える
- SwiftUIと相性抜群: リアクティブなUIが簡単に作れる
Core Dataに比べて圧倒的に使いやすくなったSwiftData。これからiOSアプリでデータを扱うなら、ぜひ@Model
を活用してみてください!