LASSIC Media らしくメディア
Core DataとSwiftData、アプリのデータ層移行外注
LASSIC IT事業部|元請(プライムベンダー)としてシステム保守・運用を受託
この記事のポイント
- iOSアプリの永続化層をCore DataからSwiftDataへ移行する際に確認すべき対応OSと移行方式の考え方を整理します。
- 完全移行と共存(コエグジステンス)、それぞれの特徴と注意点をApple公式情報をもとに解説します。
- スキーマ移行の設計や、移行を外注する際に確認しておきたいポイントも紹介します。
目次
SwiftDataとは、Core Data資産をどう変える永続化フレームワークか
SwiftDataは、Swiftの宣言的な構文でデータモデルを定義できるiOS 17以降向けの永続化フレームワークです。Core Dataの仕組みを土台にしており、完全な置き換えと部分的な共存のどちらにも対応する設計になっています*1。
Core DataからSwiftDataへの移行とは、iOSアプリのローカル永続化層をApple純正のCore Dataから、Swift向けに新しく用意されたSwiftDataへ置き換える取り組みを指します。データモデルの定義方法や保存・取得の仕組みが変わるため、単純な置換にはとどまりません。
@Modelマクロで宣言するデータモデル
Core Dataでは.xcdatamodeldファイルでエンティティを設計しますが、SwiftDataでは@Modelマクロを付けたSwiftクラスでモデルを直接記述します*1。モデル定義とアプリのロジックが同じSwiftコード内に収まるため、設計の見通しが変わってきます。
SwiftUIの@Queryとの連携
SwiftUIビュー側では、@Queryプロパティラッパーを使ってモデルの取得結果を宣言的に扱えます。Core Dataで一般的だったNSFetchedResultsControllerの実装が不要になり、画面とデータ層の結びつきがシンプルになります*1。
iOS 17未満の利用者比率が移行方式を左右する
SwiftDataはiOS 17以降・macOS Sonoma以降で利用できるフレームワークです*1。旧OSの利用者が一定数いるアプリでは、対応OSの制約が移行方式の選択に直結します。
Apple公式のガイドでは、Core Dataから完全に移行する手順と、SwiftDataを段階的に取り入れながらCore Dataと共存させる手順の両方を案内しています*2。Core Data自体の廃止は明言されておらず、既存資産をそのまま運用し続ける選択肢も残されています。
新規機能をSwiftDataで開発したい一方、既存ユーザーのOSバージョン分布によっては完全移行が難しいケースもあります。自社アプリのアクティブユーザーがどのOSバージョンを使っているかを先に確認しておく必要があります。
watchOS・tvOSでの対応状況
SwiftDataはiOS・macOSに加えて、watchOS 10以降やtvOS 17以降でも利用が案内されています*1。複数プラットフォーム向けに同じアプリを展開している場合は、各OSの対応バージョンを個別に確認する工程が必要です。
ModelContainerとSchemaで変わるデータ層の実装イメージ
SwiftDataでは、Core DataのNSPersistentContainerに相当する役割をModelContainerが担います。ModelContainerはモデルの保存先や設定をまとめて管理し、保存処理の一部を暗黙的に実行します*3。
WWDC23のセッションでは、Xcodeの機能を使って既存のCore Dataモデルからモデルクラスを生成し、SwiftDataへ段階的に置き換える流れが紹介されています*3。既存のマネージドオブジェクトモデルを土台にできるため、ゼロからモデルを設計し直す必要はありません。
共存(コエグジステンス)時に確認すべき設定
Core DataとSwiftDataを同じ永続ストアに対して共存させる場合、SwiftData側で標準で有効な永続履歴追跡をCore Data側でも有効にする必要があります*3。あわせて、両フレームワークで同名のモデルを重複させないよう、クラス名の調整が求められます*3。
バックグラウンド処理とModelActor
メイン画面とは別スレッドでモデルを操作する場合、SwiftDataにはModelActorという仕組みが用意されています。ModelActorに準拠したアクターを自作すると、モデルへの排他的なアクセスを提供できます*5。Core DataのNSManagedObjectContextを複数コンテキストで使い分けていた設計は、ModelActorを軸にした形へ組み替えることになります。
記述量の削減と対応OSの制約、両面のメリット・デメリット
SwiftDataのメリットは、モデル定義がSwiftコードとして完結し、記述量が減ることです。SwiftUIの@Queryと組み合わせることで、画面側の取得コードも簡潔になります*1。
- モデル定義が.xcdatamodeldファイルとSwiftコードの二重管理から、Swiftコードのみに一本化されます*1。
- NSFetchedResultsControllerの実装なしで、@Queryによる画面更新が行えます*1。
- ModelContainerが保存先の構成を引き受けるため、初期設定のコード量が減ります*3。
一方でデメリットもあります。対応OSがiOS 17以降に限られるため、古いOSを使う利用者を切り捨てるか、共存構成で保守対象を二重に持つかの判断が避けられません*1。また、複雑なリレーションやカスタムのスキーマ移行では、Core Data時代からの知見に加えてSwiftData固有の設計ノウハウが必要になります*4。
Core Dataは長年運用されてきたフレームワークで、情報や実装パターンの蓄積があります。SwiftDataは登場からの年数が浅く、複雑なケースに関する公開情報がCore Dataほど豊富ではない点も判断材料になります。
完全移行と共存、Core DataとSwiftDataの違いを比較する
ここまでの内容を、Core DataとSwiftDataの違いとして整理します。設計方針や移行手順を外注先とすり合わせる際の共通言語として活用できます。
| 比較項目 | Core Data | SwiftData |
|---|---|---|
| 対応OS | iOS 17より前のバージョンから継続して利用できます。 | iOS 17以降・macOS Sonoma以降が対象です*1。 |
| モデル定義方法 | .xcdatamodeldファイルでエンティティを設計します。 | @Modelマクロを付けたSwiftクラスで宣言的に定義します*1。 |
| コンテナ管理 | NSPersistentContainerを自前で構成・管理します。 | ModelContainerが保存先の設定や取得を担います*3。 |
| スキーマ移行 | Mapping ModelとNSMigrationManagerでマッピングします。 | VersionedSchemaとSchemaMigrationPlanで移行段階を定義します*4。 |
| 既存資産との関係 | SwiftData移行後も、そのまま運用を続ける選択肢があります*2。 | Core Dataの仕組みの上に構築され、完全移行・共存の両方に対応します*2。 |
この表の項目は、外注先に見積もりを依頼する際にそのまま論点として使えます。特に「スキーマ移行」と「既存資産との関係」の2項目は、対象アプリの現状によって難易度が大きく変わるため、依頼前に自社側で状況を整理しておくと、見積もりの精度が上がります。
VersionedSchemaとSchemaMigrationPlanで進めるスキーマ移行
SwiftDataでは、モデルへのプロパティ追加のように単純な変更であれば、SwiftDataが差分を自動で検出して移行するライトウェイトマイグレーションが働きます*4。
プロパティの型変更やモデルの分割・統合など複雑な変更では、VersionedSchemaでスキーマの各バージョンを定義し、SchemaMigrationPlanでバージョン間の移行手順を記述する必要があります*4。SchemaMigrationPlanは、リリースごとのスキーマを順序立てて並べ、各ステージがライトウェイトかカスタムかを注釈する仕組みです*4。
設計したSchemaMigrationPlanは、ModelContainerの設定に渡すことで実際の移行処理に反映されます*4。バージョンの順序やステージの定義を誤ると、想定した移行が実行されないため、設計段階での検証が欠かせません。
移行前のテスト設計で確認すべきこと
本番データに近いサンプルを使い、旧バージョンのスキーマから新バージョンへの移行が想定通りに動くかを事前に検証する工程が要ります。ライトウェイトマイグレーションで対応できる変更か、SchemaMigrationPlanでのカスタム移行が必要な変更かを、開発初期の段階で仕分けておくと手戻りを抑えられます*4。
移行を外注で進める理由 — 必要スキルとデータ消失リスク
スキーマ移行の設計を誤ると、旧バージョンのデータが新しいモデルへ正しく引き継がれず、起動時のクラッシュやデータの欠落につながる恐れがあります。移行計画は本番リリース前に十分な検証を重ねる工程です。
この作業を内製で進めるには、複数領域の知識が要ります。具体的には次のような知識・工程です。
- 既存のCore Dataモデル資産を棚卸しし、移行対象のエンティティと関連を洗い出す工程
- @Modelを使ったモデルの再設計と、SwiftUIの@Queryへの画面側の書き換え
- VersionedSchemaとSchemaMigrationPlanによるスキーマ移行手順の設計
- 共存構成を選ぶ場合の、Core Data側の永続履歴追跡の設定変更*3
- 対象OSバージョンごとの動作検証とリグレッションテスト
専門パートナーに依頼する場合は、対応OSの切り分けや移行方式の選定を含めた計画づくりから着手できる点が内製との違いです。内製で進めるときは、実装前に上記の知識を持つ担当者を確保できるかどうかが、スケジュールを左右する分かれ目になります。
まとめ:Core Data資産をSwiftDataへ移行する3つの判断軸
本稿では、Core DataからSwiftDataへの移行で確認すべきポイントを整理しました。要点を3つに集約すると次の通りです。第一に、SwiftDataの対応OSと自社アプリの利用者のOS分布を突き合わせること。第二に、完全移行と共存のどちらが自社の状況に合うかを見極めること。第三に、VersionedSchemaとSchemaMigrationPlanによるスキーマ移行の設計を、リリース前に十分検証することです。この3点を押さえたうえで、実装体制をどう組むかを検討することが次のステップになります。
よくある質問
Core DataからSwiftDataへの移行は内製でも進められますか?
社内にSwift・SwiftUIの開発経験者がいれば、技術的には内製での移行も可能です。ただし対応OSの切り分けやスキーマ移行の設計には専門知識が要ります*4。設計判断を誤ると、開発着手後にモデル定義をやり直す事態も起こり得るため、外部の実装経験を借りて手戻りを抑える進め方も選択肢になります。
Core DataとSwiftDataを共存させる場合、何に気をつければいいですか?
共存(コエグジステンス)では両フレームワークが同じ永続ストアを参照します。SwiftData側で標準有効な永続履歴追跡をCore Data側でも有効にし、モデル名の重複を避ける設定が必要です*3。設定を誤ると、片方での変更がもう一方に反映されない不整合が起こることがあります。
利用者の一部がiOS 17より前の端末を使っている場合はどうなりますか?
SwiftDataはiOS 17以降でのみ動作するため*1、旧OS利用者が一定数いる間はCore Data側の実装を残す共存構成を選ぶか、対応OSを引き上げてから完全移行するかのいずれかになります。自社アプリの利用者のOS分布を踏まえた判断が必要です。
CloudKitで同期している既存データは移行時にどうなりますか?
Core DataでCloudKit連携をしているアプリをSwiftDataへ切り替える場合も、共存構成またはXcodeのモデル生成機能を使った変換手順に沿って進めます*2*3。移行前に同期設定とスキーマの整合性を確認しておく必要があります。
著者:テレリモ総研編集部 鈴木 亮佑
ITアウトソーシング・システム開発のご相談はLASSICへ
元請(元請(プライムベンダー))として、貴社の課題に合わせた体制構築・開発支援をご提案します。まずはお気軽にご相談ください。
ご不明な点はお問い合わせフォームからもご連絡いただけます。
- *1 出典:Apple Developer Documentation「SwiftData」
- *2 出典:Apple Developer Documentation「Adopting SwiftData for a Core Data app」
- *3 出典:Apple「Migrate to SwiftData」WWDC23セッション10189(2023年)
- *4 出典:Apple Developer Documentation「SchemaMigrationPlan」
- *5 出典:Apple Developer Documentation「ModelActor」