SwiftJsonUI 7.0.0 beta Changes - Tai-Kimura/SwiftJsonUI GitHub Wiki

SwiftJsonUI 7.0.0 変更内容

リリース日

2025年8月21日(正式版) 2025年8月17日(ベータ版)

最新アップデート (2025年8月22日)

パフォーマンス最適化

Dynamic コンポーネントの最適化

  • DEBUG ガードの追加: すべての Dynamic コンポーネントに DEBUG 条件コンパイルフラグを追加し、リリースビルドでのパフォーマンスを大幅に向上
  • Static コンポーネントの再利用: Dynamic の依存関係を既存の Static コンポーネントを使用するようにリファクタリング
  • StateAwareContainer の改善: Dynamic 依存を削除し、より汎用的な実装に変更
  • where 句の追加: StateAwareContainer 拡張に where 句を追加し、型安全性を向上

ビルド設定の最適化

  • リリースビルドの高速化: Dynamic コンポーネントのコンパイル時除外により、リリースビルドが大幅に高速化

必要環境

  • iOS 16.0+ (iOS 13.0+ から変更)
  • Swift 5.8+
  • Xcode 14.0+
  • Node.js(開発ツール用)

重大な変更点

1. SwiftUI サポートの追加 🎉

  • SwiftJsonUI が SwiftUI に対応しました
  • 従来の UIKit ベースの実装に加えて、SwiftUI でも同じ JSON 定義を使用してUIを構築できるようになりました
  • 一つの JSON ファイルから UIKit と SwiftUI の両方のビューを生成可能

2. フォルダ構造の大幅な変更

  • binding フォルダが uikit フォルダに名称変更
    • 従来: binding_builder/lib/binding/
    • 新規: sjui_tools/lib/uikit/
  • 新しく swiftui フォルダが追加
    • パス: sjui_tools/lib/swiftui/
  • UIKit と SwiftUI の実装が明確に分離され、管理しやすくなりました

3. Include 機能の処理改善(UIKit)

  • UIKit(旧binding)機能の include 処理に変更が加わりました
  • より効率的で柔軟な include コンポーネントの処理が可能に
  • Dynamic Include ビューのレンダリングが強化されました

新機能

1. SafeAreaView コンポーネントの追加

  • 新しい SafeAreaView タイプ: システムUIに遮られない安全な領域内にコンテンツを配置
  • UIKit: safeAreaLayoutGuide を使用して自動的にセーフエリアを考慮
  • SwiftUI: ネイティブのセーフエリア処理にマップ、カスタマイズ可能なエッジ設定
  • View との違い: SafeAreaView はセーフエリアを尊重、View は無視してシステムUI下まで拡張
  • safeAreaInsetPositions: SwiftUI で特定のエッジのみセーフエリアを適用可能

2. ViewSwitcher の実装(SwiftUI)

  • SwiftUI で Dynamic モードと生成済みモードの切り替えが可能な ViewSwitcher を追加
  • DEBUG ビルドではデフォルトで Dynamic モード(JSON から直接レンダリング)
  • RELEASE ビルドではデフォルトで静的モード(生成済みコード使用)
  • isDynamicMode がリードオンリーに変更
  • パフォーマンスと開発効率の最適なバランスを実現

2. SwiftUI プロパティの大幅拡張

以下のプロパティが SwiftUI でサポートされました:

  • マージン (margins)
  • 可視性状態 (visibility states)
  • 不透明度 (opacity)
  • セキュアフィールド (secure fields)
  • テキスト装飾 (text decorations)
  • アライメントプロパティ (alignment properties)
  • グラデーションスタイル (gradient styles)
  • ページングサポート (paging support)
  • その他多数のUI関連プロパティ

3. Button コンポーネントの機能強化

  • frame サポートの追加: Button に直接 frame を設定可能
  • enabled プロパティの追加: データバインディング対応の有効/無効状態制御
  • 背景色の適用改善: ボタン全体のエリアに背景色が正しく適用されるよう修正
  • wrapContent 幅の処理改善: Dynamic モードでの幅展開動作を Static モードと統一
    {
      "type": "Button",
      "frame": {"width": 200, "height": 50},
      "enabled": "@{isButtonEnabled}",
      "background": "#007AFF"
    }
    

4. 変数置換のサポート

  • DynamicView で "@{} 構文" を使用した変数置換が可能に
  • より動的で柔軟なビュー生成が実現

5. アクションハンドラーの改善

  • パラメータ付きアクションハンドラーのサポート
  • viewModel プレフィックス付きのアクション呼び出しを実装
  • ":" サフィックス付きアクションのメソッド処理を強化

6. ViewModel 管理の改善

  • ViewModel 専用ディレクトリの作成
  • 個別の ViewModel ファイル生成
  • destroy コマンドが ViewModel ファイルも処理するように更新

7. プロジェクト構造と設定の改善

  • ワークスペース構造での設定ファイル検出を改善
  • ビュー生成時の --root オプションのサポート
  • 新しいルートビューで App.swift を自動更新

8. ビュー生成とフォルダ構造の改善

  • SwiftUI ビュー用の新しいフォルダ構造を実装
  • 手動編集可能なビューと自動生成ビューの分離
  • build と destroy コマンドの改善

9. Modifier システムのリファクタリング

  • CommonModifiers に柔軟な modifier システムを追加
  • modifier 適用順序の改善(padding が frame より前に適用)
  • padding/margin 処理の統合

10. Dynamic モードの改善

  • ViewModel データ変更時のビュー更新修正
  • Include コンポーネントの処理改善
  • 各コンポーネントでの frame と padding の処理改善
  • スタイルファイルのキャッシュと監視機能の強化
  • 複数の検索戦略によるスタイルファイル読み込みの改善
  • ScrollView の SafeArea 処理を contentInsetAdjustmentBehavior で制御

バグ修正と改善

Dynamic モードと Static モードの一貫性

  • SafeArea 処理を両モード間で統一
  • デフォルトのスタックアライメントを統一
  • ボタンの幅展開動作を両モードで一致
  • 子ビューのアライメント処理を改善

テキスト処理の修正

  • クォートのエスケープ処理を修正
  • テキスト補間の改善
  • RGBA カラーサポートの追加

レイアウト関連の修正

  • ScrollView 内の子ビューへのパディング適用修正
  • 親ビューが orientation を持つ場合の子アライメント修正
  • SelectBox の frame とパディング処理を改善
  • Include されたコンポーネントの表示問題を修正

ビルドシステムの改善

  • sjui build --clean オプションの追加
  • キャッシュクリア機能の実装

技術的な改善

  • Dynamic モードのレンダリングシステムの大幅な見直し
  • 一貫性、柔軟性、コンポーネント処理の改善
  • より効率的なビューの更新メカニズム
  • UIKit と SwiftUI の両方をサポートする統一されたアーキテクチャ
  • DEBUG/RELEASE ビルドでの自動的な最適化切り替え
  • Static コンポーネントを基盤とした Dynamic 実装によるコードの重複削除

SwiftUI モードの詳細

プロジェクト構造

SwiftUI モードでは、以下のディレクトリ構造が作成されます:

YourProject/
├── Layouts/           # JSON レイアウトファイル
├── Styles/            # スタイル定義ファイル
├── View/              # SwiftUI ビュー
│   └── [ViewName]/    # 各ビューごとのフォルダ
│       ├── [ViewName]View.swift          # メインビュー(手動編集可)
│       └── [ViewName]GeneratedView.swift # 生成されたビュー(自動生成)
├── ViewModel/         # ViewModel ファイル
│   └── [ViewName]ViewModel.swift
└── Data/              # データモデル
    └── [ViewName]Data.swift

sjui コマンドの使い方

1. 初期化

# SwiftUI モードで初期化
sjui_tools/bin/sjui init --mode swiftui

# UIKit と SwiftUI 両方をサポート
sjui_tools/bin/sjui init --mode all

初期化時に mode を指定すると、sjui.config.json に mode が保存されます。以降のコマンドは config ファイルの mode 設定を自動的に使用します。

2. ビューの生成

# 基本的なビュー生成(config の mode を使用)
sjui_tools/bin/sjui g view HomeView

# ルートビューとして生成(App.swift を自動更新)
sjui_tools/bin/sjui g view HomeView --root

# サブディレクトリに生成
sjui_tools/bin/sjui g view Settings/ProfileView

3. ビルド(JSON から Swift コード生成)

# config の mode に従ってビルド
sjui_tools/bin/sjui build

# 一時的に別のモードでビルド(config の設定を上書き)
sjui_tools/bin/sjui build --mode swiftui
sjui_tools/bin/sjui build --mode uikit
sjui_tools/bin/sjui build --mode all

注意: --mode オプションは config ファイルの設定を一時的に上書きします。通常は config ファイルで mode を設定しておけば、コマンドごとに指定する必要はありません。

生成されるファイルの詳細

1. JSON ファイル (Layouts/home_view.json)

{
  "type": "View",
  "width": "matchParent",
  "height": "matchParent",
  "background": "#FFFFFF",
  "orientation": "vertical",
  "child": [
    {
      "data": [
        {
          "name": "title",
          "class": "String",
          "defaultValue": "HomeView"
        }
      ]
    },
    {
      "type": "Label",
      "id": "title_label",
      "text": "@{title}",
      "fontSize": 24
    }
  ]
}

2. メインビュー (View/HomeView/HomeViewView.swift)

  • 手動で編集可能
  • Include サポート用の data パラメータ付き初期化子
  • Navigation や Sheet などのビューレベルモディファイアを追加可能

3. 生成ビュー (View/HomeView/HomeViewGeneratedView.swift)

  • JSON から自動生成される
  • sjui build コマンドで更新される
  • ViewSwitcher により Dynamic/Static モードを切り替え可能

4. ViewModel (ViewModel/HomeViewViewModel.swift)

  • ObservableObject として実装
  • データバインディングのロジックを含む
  • アクションハンドラーを定義

5. Data モデル (Data/HomeViewData.swift)

  • JSON の data セクションから自動生成
  • @Published プロパティを持つ

Config ファイル (sjui.config.json)

{
  "mode": "swiftui",
  "project_name": "YourProject",
  "source_directory": "YourProject",
  "layouts_directory": "Layouts",
  "styles_directory": "Styles",
  "view_directory": "View",
  "data_directory": "Data",
  "viewmodel_directory": "ViewModel",
  "swiftui": {
    "output_directory": "Generated"
  },
  "hotloader": {
    "ip": "127.0.0.1",
    "port": 8081,
    "watch_directories": ["Layouts", "Styles"]
  }
}

アップグレードガイド

6.3.0 から 7.0.0 へのアップグレード

  1. Package.swift の更新

    dependencies: [
        .package(url: "https://github.com/Tai-Kimura/SwiftJsonUI.git", from: "7.0.0")
    ]
    
  2. フォルダ構造の移行

    • binding フォルダへの参照を uikit に更新
    • SwiftUI を使用する場合は、新しい swiftui フォルダ構造を確認
  3. CLI ツールの更新

    # 最新の sjui ツールをインストール
    curl -fsSL https://raw.githubusercontent.com/Tai-Kimura/SwiftJsonUI/master/installer/bootstrap.sh | bash -s -- -v 7.0.0
    
  4. SwiftUI プロジェクトの初期化

    # 既存プロジェクトを SwiftUI モードに移行
    sjui_tools/bin/sjui init --mode swiftui
    sjui_tools/bin/sjui setup
    
  5. ViewSwitcher の活用

    • DEBUG/RELEASE ビルドで自動的にモードが切り替わります
    • 必要に応じて手動でモードを設定することも可能
  6. Button コンポーネントの確認

    • frame と enabled プロパティを活用した改善が可能
  7. Dynamic モードを使用している場合

    • ViewModel のデータ変更がより確実に反映されます
    • Include 処理が改善されているため、動作確認を推奨

注意事項

  • 7.0.0 正式版がリリースされました。本番環境での使用が可能です
  • UIKit から SwiftUI への移行は段階的に行うことを推奨します
  • バグや不具合を発見した場合は、GitHub の issue で報告してください
  • 正式版リリースまでに API の変更がある可能性があります

今後の予定

  • SwiftUI サポートの更なる拡充
  • パフォーマンスの最適化
  • ドキュメントの充実
  • より多くのコンポーネントの SwiftUI 対応