WWDC 2024 前の展望:SwiftData の未来の可能性と現実の課題
2023 年の世界開発者会議(WWDC)で、アップルは待望の新しいデータ管理フレームワーク、SwiftData を発表しました。Core Data の後継として、SwiftData はアップルのエコシステムで重要な役割を果たすことができるでしょうか?2024 年の WWDC が迫る中、この記事では、SwiftData が最初にリリースされてからの全体的なパフォーマンスを評価し(つまり、最初のメジャーバージョンである Xcode 15 の間)、その将来の展望を考察します。
この原文は私のブログ Fatbobman's Blog に掲載されています。Swift、SwiftUI、Core Data、SwiftData に関する最新のアップデートや優れた記事をお見逃しなく。Fatbobman's Swift Weekly に登録して、毎週の洞察と貴重なコンテンツを直接メールボックスにお届けします。
未来への一歩:SwiftData、現代のデータ管理フレームワーク
SwiftData は完全にゼロから構築されたわけではなく、その核心技術は依然として Core Data に基づいています。WWDC 2023 の SwiftData に関する最初の セッション で、Apple はこの点について詳細を述べませんでした。
初めてのことで、Apple が最初から Core Data との関連性を明確にしなかったことに戸惑い、それが隠蔽の一種ではないかと疑いました。しかし、SwiftData について深く理解するにつれ、Apple の戦略が徐々に理解できるようになりました。SwiftData は、Core Data の確かな技術基盤に構築されているものの、その全体的なデザインと提示は、全く新しいデータ管理フレームワークの誕生を示すものです。Apple が Core Data との関連性を薄める選択は、開発者が Core Data の固定観念に縛られることなく、SwiftData チームの現代データ管理フレームワークへの新しい解釈をより良く理解することを目的としています。この戦略は、SwiftData を独立したフレームワークとしての位置づけを強調するとともに、Apple エコシステムでの将来的な役割を明確に定義しています。
Core Data の経験が豊富な開発者にとっては、SwiftData が提案する新しいプログラミング哲学を理解し適用する際に、UIKit 開発者が SwiftUI へ移行したときの挑戦と似た障害に直面するかもしれません。
SwiftData は、Core Data における複雑であまり使用されない機能を簡素化するだけでなく、現代的なプログラミング概念に合った多くの新しい実践を導入しています。このフレームワークは Swift 言語の新機能を最大限に活用し、安全で安定的かつエレガントなコードの構築方法を示しており、Apple エコシステム内での核心的な役割を確固たるものにしています。
そのため、SwiftData は全く新しく、現代化されたデータ管理フレームワークとして位置付けられ、今後 10 年以上にわたり Apple エコシステムで中心的な役割を果たす潜在力を持っていると考えられます。
急ぎ足でのリリース:SwiftData が直面する実際の問題点
SwiftData の設計は非常に先進的ですが、そのリリースは明らかに急ぎ足であり、初版ではいくつかの重要な機能が欠けているだけでなく、以下のいくつかの重要な問題がパフォーマンスと使い勝手に深刻な影響を与えています:
-
未熟な述語変換機能:
SwiftData は、Foundation が提供する新しい Predicate システムを導入しました。これはより安全で人間工学に基づいたものです。従来の NSPredicate ほど機能が豊富ではないものの、ほとんどの開発者の検索要求を満たすには十分です。しかし、データのクラウド同期機能を活用するアプリケーションが増えるにつれ、モデルの属性がオプション値として宣言されることが多くなり、同期要件を満たすためです。しかし、現在の SwiftData は、オプショナル値を含む述語の変換(述語を SQL コマンドに変換する)において性能が低下しており、特に「多対多」でオプショナルな述語を含む場合の処理がほとんど不可能です。この変換能力の不足は、SwiftData の使い勝手に重大な影響を与えるだけでなく、SwiftData を使用するアプリケーションが提供可能な機能にも大きな制約を与えています。
-
UI がデータ更新に異常反応:
SwiftData は、Swift の現代的な並行処理モデルを活用し、
@ModelActor
を用いてデータ操作の並行性をエレガントに扱うことを可能にしました。これにより、Core Data で一般的な並行処理に関するクラッシュ問題を効果的に回避できます。しかし、一年以上のマイナーアップデートを経ても、@ModelActor
を使用したデータ更新が SwiftUI ビューによってタイムリーに反応されないことが多く、開発者はこの問題を避けるために@ModelActor
の使用を諦めたり、ビューの更新を強制する様々な技術を使用する必要があります。これは、その特性の潜在能力を無駄にするだけでなく、アプリケーションの効率にも悪影響を与えています。 -
モデルの検証と変換の問題:
Core Data では、データネットワーク同期機能を有効にすると、Xcode のモデルエディターがモデルが同期規格に適合しているか自動的に検証します。これに対して、SwiftData は純粋なコードベースのモデリングを採用しており、開発者が手動でコードを書いてモデルの検証を行う必要があります。この方法は開発の複雑さを増すだけでなく、同期規格について十分な理解がない開発者がプロジェクトの終盤になって初め
てモデルの不一致に気づき、広範な修正が必要になる可能性があります。また、コードで宣言されたモデルを Core Data が認識できるNSManagedObjectModel
に変換する過程でも、特に逆関係の注釈が欠けている場合(省略可能だった注釈)には、変換エラーが時々発生します。これらのエラーは通常、発見が困難であり、デバッグには多大な時間と労力が必要です。
-
Codable サポートとデータストレージの不明瞭さ:
SwiftData は、Codable プロトコルに準拠した型をモデル属性として直接使用することを許可し、モデルの明確性を大幅に向上させ、操作を簡素化しました。しかし、公式には明確な規格と明確なストレージ対応関係が提供されておらず、これが実際の使用において開発者に多くの挑戦をもたらしています。まず、Codable プロトコルに準拠したすべての型が安定して変換されるわけではなく、場合によってはプログラムのクラッシュを引き起こす可能性があります。次に、公式の明確な指導が欠けているため、Codable 型の調整時にモデルのアップグレードに関する問題に直面することがあり、特にデータクラウド同期を使用するシナリオでは、新しいバージョンのモデルがシームレスな移行(軽量移行を利用する)を行うことができない可能性があります。
SwiftData の初版の機能が Core Data ほど完全ではないにせよ、そのフレームワークが安定して動作し、プロジェクトの要件を満たす場合、これらの欠点は大きな問題ではありません。しかし、前述したように、存在する問題がアプリケーションに異常を引き起こし、開発プロセス中に予期せぬ障害をもたらす可能性があります。
総じて、SwiftData のリリースが急ぎ足だったため、その初版の実際のパフォーマンスは期待に完全には応えられず、データ管理フレームワークとして持つべき能力と安定性を十分に示すことができませんでした。したがって、間近に迫った WWDC 2024 で SwiftData に対する必要なアップデートと強化が非常に重要になります。
適用範囲:SwiftData の最初のバージョンは誰に向いているか?
SwiftData の研究に多くの労力を注いだ開発者として、その精巧な設計と明るい将来については十分に認識していますが、SwiftData の最初のバージョンがすべての開発者やプロジェクトに適しているわけではないことを認めなければなりません。
-
初心者(データ管理フレームワークの経験がない方)にはお勧めしません
データ管理フレームワークにあまり慣れていない開発者は、SwiftData の機能と制限についての理解不足が原因で、プロジェクト開発中に乗り越えられない障害に直面する可能性があります。
-
要求が複雑なプロジェクトにはお勧めしません
プロジェクトがデータ管理フレームワークに高い要求を持つ場合、Core Data の成熟度と機能の完全性が、SwiftData の最初のバージョンよりも適した選択肢となります。SwiftData と Core Data をプロジェクトで統合する能力があっても、そのために投じるコストと労力は割に合わないかもしれません。
-
要求がまだ明確でないプロジェクトにはお勧めしません
プロジェクトの機能が拡張されるにつれて、SwiftData の最初のバージョンでは開発ニーズを満たせないことが明らかになるかもしれません。
-
要求が明確であり、SwiftData の現在の問題に関係しないプロジェクトにはお勧めします
最初のバージョンには制限がありますが、機能要求が単純で複雑な関係やパフォーマンスの問題が関係しないプロジェクトには、SwiftData の最初のバージョンで主要な問題を回避できる場合、SwiftData は適しています。また、プロジェクトがデータネットワーク同期機能を使用しない場合、SwiftData のいくつかの欠点をさらに回避できます。
-
特定の層:試す価値があります
プロジェクトの機能要求を十分に理解し、SwiftData の最初のバージョンの制限と不足を完全に把握している開発者、特に Core Data の開発経験が豊富な方には、正式なプロジェクト開発で SwiftData の最初のバージョンを使用することは挑戦的ですが、困難を解決する成就感をもたらすこともあります。
SwiftData の最初のバージョンのパフォーマンスが完全に期待に応えることはなかったにせよ、その先進的な設計理念とエレガントな実装方式は、開発者が学び、模範とする価値があります。**現在データ管理フレームワークを必要としていないか、SwiftData の使用を考慮していない場合でも、それを学び、理解することは、将来の
開発作業にプラスの影響をもたらす可能性があります。**
過去一年以上にわたって、私は SwiftData に関する 10 以上の記事を執筆しました。これらの記事は、Fatbobman's Swift Blog で詳しく探究されており、このフレームワークを深く理解したい開発者にとって非常に有益です。
未来への展望:SwiftData の今後の変化
WWDC 2024 が迫る中、私は今後のアップデートで、SwiftData の最初のバージョンで露呈したいくつかの主要な問題が解決されることを期待しています。
前述の通り、Apple は SwiftData を、現在及び将来の Apple エコシステムに特化した全く新しいデータ管理フレームワークとして開発しています。これは特に、高速 CPU や固体ディスクなどの高性能ハードウェアを搭載したモバイルアプリケーションと環境を対象としています。そのため、市場やハードウェア環境の変化を考慮し、Core Data に特有の多くの機能が SwiftData には取り入れられない可能性があります。また、SwiftData はより精緻なカプセル化を導入することで、過去の複雑な操作を簡素化するかもしれません。
したがって、私は Apple がどのような新機能を SwiftData に追加するかに興味を持っています。これは、どの機能が追加されるかだけでなく、その機能追加の方法にも焦点を当てています。
SwiftUI の発展を経験から考えると、SwiftData が Apple エコシステムで公式の主要なデータ管理フレームワークとなるまでには、おそらく 2〜3 年の時間が必要でしょう。このプロセスは長期にわたり挑戦的なものとなりますが、最終的には開発者に強力なツールを提供し、未来のアプリケーション構築を支援します。
SwiftData を既に使用している開発者へのアドバイス
もし既にプロジェクトで SwiftData を使用しており、うまく機能している場合、まずはおめでとうございます🎉!さらに、SwiftData の最初のバージョンが現在直面している主要な問題をより深く理解し、今後のアップデートでこれらの問題を避けるようにすることをお勧めします。最後に、可能な場合は、iOS 18(または他のプラットフォームの新しいシステム)がリリースされた後に、プロジェクトの最低システム要件を引き上げて、新しいシステムがもたらす最適化や改善を活用することをお勧めします。
付録:SwiftData の最初のバージョンで欠けている主要な機能、大きな問題点、および一時的な対処法
- 遅延ロード(フォルティング):SwiftData は、データの遅延ロードのための Core Data におけるフォルティング機能をサポートしていません。
- バッチデータ操作:現在、バッチデータ操作に対するサポートはありませんが、Core Data との統合により実現可能です。
- 複数の永続性ストレージのサポート:iOS 17.4 以前では、SwiftData は複数の永続性ストレージをサポートしていませんでした。
-
高度なクエリ機能:
group
、having
、distinct
などの高度なクエリ機能に対応していません。必要な場合、SwiftDataKit を通じて対応できます。 - 述語機能の制限:同期機能を有効にした後、多対多の関係で述語を表現する能力が制限されます。
- 公共データベースとデータ共有:公共データベースの同期 および データの共有 に対応していません。
- パフォーマンス問題:多対多の関係における操作が 重大なパフォーマンス問題 を引き起こす可能性があります。
-
ビュー更新応答:
@ModelActor
内で更新されたデータにビューが応答できません。解決策一 および 解決策二 を参照してください。 - 述語のマージ:述語のマージに対応していません。この解決策 を参照してください。
- Codable サポート:Codable プロトコルに準拠する型を使用する場合、すべてのプロパティが SQLite の基本的なプロパティ(整数、浮動小数点数、日付など)と一致することを確認してください。
- Codable とクエリ基準:Codable 型のプロパティはクエリ基準として使用できません(ただし Core Data は 複合属性 をサポートしています)。
- モデル検証:同期をサポートするデータモデルを開発する際には、最初にモデルを検証 してください。
- 列挙型の保存:列挙型を直接ストレージタイプとして使用することは推奨されません
。クエリ基準として使用できないため、対応する rawValue を保存するのが最善です。
-
イベント処理の不足:
didSave
やwillSave
などのライフサイクルイベント中にカスタムロジックを追加することはサポートされていません。この制限はデータ保存プロセス中に特定のアクションを実行する能力に影響します。解決ガイド で利用可能な対処法があります。 -
カスケード削除の問題:
cascade
削除ルールを使用して削除操作を実行する際、SwiftData は関連する関連データを自動的に削除しません。この機能は SwiftDataKit を使用して実現できます。 - システムバージョン要件:プロジェクトの最低システム要件を引き上げることをお勧めします。推奨される最低バージョンは iOS 17.2 以上です。
Discussion