RORK LABEN
NATIVE — Rork Max では AR / LiDAR スキャン、Metal を使った 3D、Dynamic Island、Siri Intents、HealthKit、NFC、App Clips、Core ML まで届きますIOS27 — iOS 27 Developer Beta 4 で Siri AI の対象が iPhone 15 Pro / 15 Pro Max・16 シリーズ・17 系へ広がり、応答が初期ベータより明確に速くなりましたDESIGN — iOS・iPadOS・macOS 27 向けの Apple 純正デザインキットが Figma と Sketch 向けに公開されました。新 OS の UI を組む段階で参照できますCANARY — Android 17(Cinnamon Bun)は従来の Developer Preview を廃し、継続更新される Canary ビルドへ移行しました。検証のタイミング設計が変わりますSPARK — Android 17 の Gemini Spark は、アプリを直接操作して配車の予約や注文といった複合的な作業を自動化しますSCALE — Rork は a16z から $2.8M を調達し、月間訪問は74万件規模まで伸びていますNATIVE — Rork Max では AR / LiDAR スキャン、Metal を使った 3D、Dynamic Island、Siri Intents、HealthKit、NFC、App Clips、Core ML まで届きますIOS27 — iOS 27 Developer Beta 4 で Siri AI の対象が iPhone 15 Pro / 15 Pro Max・16 シリーズ・17 系へ広がり、応答が初期ベータより明確に速くなりましたDESIGN — iOS・iPadOS・macOS 27 向けの Apple 純正デザインキットが Figma と Sketch 向けに公開されました。新 OS の UI を組む段階で参照できますCANARY — Android 17(Cinnamon Bun)は従来の Developer Preview を廃し、継続更新される Canary ビルドへ移行しました。検証のタイミング設計が変わりますSPARK — Android 17 の Gemini Spark は、アプリを直接操作して配車の予約や注文といった複合的な作業を自動化しますSCALE — Rork は a16z から $2.8M を調達し、月間訪問は74万件規模まで伸びています
記事一覧/開発ツール
開発ツール/2026-06-16上級

Rork Max が生成した SwiftUI アプリに SwiftData を後付けする

Rork Max が出力した SwiftUI コードは画面は作れても永続化が @State 止まりになりがちです。SwiftData を後付けする際のモデル設計、ContainerとViewの接続、スキーマ移行の実装パターンを手を動かしながら整理しました。

Rork Max231SwiftData2SwiftUI64永続化マイグレーション

プレミアム記事

ある夜、Rork Max に「習慣トラッカーを作って」と頼んで出てきた SwiftUI のコードを眺めていて、ふと手が止まりました。画面の作りは想像以上に丁寧で、リストもチェックボックスも整っている。けれど、アプリを再起動すると入力した習慣がすべて消えるのです。

理由はコードを開いてすぐに分かりました。データは @State private var habits: [Habit] = [] に置かれているだけで、ディスクには一切書かれていません。Rork Max は「動いて見える画面」を最短で出すことに長けていますが、永続化レイヤーまで自分で設計してくれるわけではない、というのがこの夜の実感でした。

ここからは、その生成コードを土台にしながら、SwiftData を後付けして「再起動しても消えないアプリ」に育てるまでの工程を、実際に書いたコードと一緒に残しておきます。個人開発で何度もこの壁にぶつかってきた経験から、つまずきやすい順に並べました。対象は iOS 17 以降、Rork Max が吐く SwiftUI を Xcode あるいはクラウドビルドで触れる方を想定しています。

なぜ @State のままでは破綻するのか

生成直後のコードは、たいてい次のような形をしています。

struct Habit: Identifiable {
    let id = UUID()
    var name: String
    var doneToday: Bool
}
 
struct ContentView: View {
    @State private var habits: [Habit] = [
        Habit(name: "朝の散歩", doneToday: false),
        Habit(name: "読書", doneToday: false)
    ]
 
    var body: some View {
        List($habits) { $habit in
            Toggle(habit.name, isOn: $habit.doneToday)
        }
    }
}

このコードは画面としては完成しています。けれど @State はビューの生存期間にだけ紐づくメモリ上の状態なので、プロセスが終われば消えます。デモとしては十分でも、ユーザーに毎日使ってもらうアプリとしては成立しません。

ここで多くの方が UserDefaultsCodable を JSON 化して詰める方法に飛びつきます。私自身、初期のアプリではそうしていました。ただ、項目が増えてリレーションや検索条件が出てくると、JSON 全体を読み書きする方式はすぐに苦しくなります。SwiftData はこの「育っていくデータ」を前提に設計されているので、個人的には最初に少し手間をかけて移しておくことを推奨します。後の運用が驚くほど楽になります。

ステップ1: モデルを @Model に置き換える

最初の一手は、構造体を @Model クラスへ変えることです。struct ではなく final class になる点が要注意で、ここを見落とすとコンパイルが通りません。

import SwiftData
 
@Model
final class Habit {
    var name: String
    var doneToday: Bool
    var createdAt: Date
 
    init(name: String, doneToday: Bool = false, createdAt: Date = .now) {
        self.name = name
        self.doneToday = doneToday
        self.createdAt = createdAt
    }
}

@Model を付けると、SwiftData がプロパティの変更を自動で追跡し、保存対象として扱ってくれます。id を手で持たなくても、SwiftData が内部の永続 ID を管理します。

ここで一つ判断が要ります。生成コードに let id = UUID() が残っている場合、表示やアニメーションが id に依存していなければ削っても構いません。ただし ForEachid: 指定で参照しているなら、安定した識別子として UUID 型のプロパティを明示的に残す方を私は好みます。Rork Max の出力はこのあたりが曖昧なことが多いので、ForEach の使われ方を一度確認してから決めるのが安全です。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
生成コードの @State 依存を SwiftData の @Model へ段階的に移し替える具体手順
アプリを壊さずスキーマを育てるための VersionedSchema と MigrationPlan の実装
起動時クラッシュを避けるための ModelContainer フォールバック設計
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-07-18
文字サイズ最大とドイツ語で、生成された画面は静かに詰まる — Rork Max の SwiftUI にレイアウト耐性の検証を通した記録
Rork Max が生成した SwiftUI 画面を疑似ローカライズと最大文字サイズに通し、どこから詰まるかを機械的に洗い出した記録です。ViewThatFits・ScaledMetric・layoutPriority の使いどころと、再生成のたびに回帰を捕まえるスナップショット検証を、実際の数値とともにまとめました。
開発ツール2026-07-12
Rork Maxのアプリで、アイコンを気持ちよく動かすsymbolEffect実装メモ
Rork Maxが生成したSwiftアプリで、SF Symbolsをbounce・pulse・variableColor・contentTransitionで動かす実装を、動くコードとOSバージョンの出し分け、そして動かしすぎて後悔した落とし穴つきで整理します。
開発ツール2026-07-09
Rork Max が書いた Swift を、Swift 6 の厳格な並行性検査に通す
Rork Max が生成した SwiftUI アプリを Swift 6 の complete concurrency checking に通した記録です。警告217件をターゲット単位で削り、@MainActor の置き場所と Sendable の壊し方を実測とともに整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →