SwiftJsonUI 7.1.0 Release Notes ja - Tai-Kimura/SwiftJsonUI GitHub Wiki

SwiftJsonUI 7.1.0 リリースノート

リリース日

2025年8月26日

概要

SwiftJsonUI 7.1.0 では、SwiftUI 向けカスタムコンポーネントサポートを導入しました。これにより、開発者は Static モードと Dynamic モードの両方でシームレスに動作する、再利用可能なカスタムコンポーネントを作成できるようになります。

✨ 主な新機能

SwiftUI 向けカスタムコンポーネント

新機能

SwiftUI モードで初めて以下が可能になりました:

  • sjui g converter を使用してカスタムで再利用可能なコンポーネントを作成
  • Static モードと Dynamic モードの両方でカスタムコンポーネントを使用
  • 生成された Static コンバーターを修正して動作をカスタマイズ
  • Dynamic モードでカスタムコンポーネントの完全なホットリロードサポート

完全なソリューション

sjui g converter コマンドは 3 つの重要なファイルを生成します:

  1. Swift コンポーネント (Extensions/MyComponent.swift)

    • 実際の SwiftUI View 構造体
    • 生成後に完全にカスタマイズ可能
    • コンテナ型と非コンテナ型の両方をサポート
  2. Ruby コンバーター (sjui_tools/lib/swiftui/views/extensions/my_component_converter.rb)

    • Static モード用に JSON を Swift コードに変換
    • 特殊な属性を処理するためにカスタマイズ可能
    • converter_mappings に自動登録
  3. Dynamic アダプター (Extensions/Adapters/MyComponentAdapter.swift)

    • ホットリロード付きの Dynamic モードサポートを有効化
    • rawData 経由ですべての JSON プロパティにアクセス
    • 最適なパフォーマンスのため DEBUG ビルドでのみコンパイル

使用方法

1. カスタムコンポーネントの生成

# 基本的なコンポーネント
sjui g converter MyCard

# 属性付き
sjui g converter MyCard --attributes "title:String,subtitle:String,elevation:Double"

# コンテナコンポーネント(子要素を持てる)
sjui g converter MyContainer --container

# 非コンテナコンポーネント(子要素を持てない)
sjui g converter MyBadge --no-container

2. 生成されるファイル

Swift コンポーネント (Extensions/MyCard.swift):

struct MyCard<Content: View>: View {
    let title: String
    let subtitle: String
    let elevation: Double
    let content: Content?
    
    init(title: String, subtitle: String, elevation: Double, 
         @ViewBuilder content: () -> Content = { EmptyView() }) {
        self.title = title
        self.subtitle = subtitle
        self.elevation = elevation
        self.content = content()
    }
    
    var body: some View {
        // ここでコンポーネントをカスタマイズ
        VStack {
            Text(title).font(.headline)
            Text(subtitle).font(.subheadline)
            if let content = content {
                content
            }
        }
        .shadow(radius: elevation)
    }
}

Ruby コンバーター(Static モード用):

class MyCardConverter < BaseViewConverter
  def convert
    # JSON から Swift への変換を処理
    # 特殊な属性処理のためにカスタマイズ可能
  end
end

Dynamic アダプター(ホットリロード付き Dynamic モード用):

#if DEBUG
struct MyCardAdapter: CustomComponentAdapter {
    func buildView(component: DynamicComponent, ...) -> AnyView {
        // すべての JSON プロパティにアクセス
        let title = component.rawData["title"] as? String ?? ""
        let subtitle = component.rawData["subtitle"] as? String ?? ""
        let elevation = component.rawData["elevation"] as? Double ?? 0
        
        // ビューを構築して返す
        return AnyView(MyCard(...))
    }
}
#endif

3. JSON での使用

{
  "type": "MyCard",
  "title": "ようこそ",
  "subtitle": "カスタムコンポーネントの例",
  "elevation": 4.0,
  "child": [
    {
      "type": "Label",
      "text": "これはカードのコンテンツです"
    }
  ]
}

主な利点

  • 完全な SwiftUI サポート: SwiftUI モードで初めてカスタムコンポーネントをサポート
  • 🛠️ 完全なカスタマイズ: すべての生成ファイルを修正可能
  • 🔥 ホットリロード: Dynamic モードで高速開発が可能
  • 📦 自動登録: コンポーネントは自動的に登録される
  • 🎯 型安全性: Static モードはコンパイル時チェックを提供
  • 🚀 パフォーマンス: Dynamic アダプターは DEBUG ビルドでのみコンパイル

コンポーネントタイプ

コンテナコンポーネント

  • 子コンポーネントを持てる
  • @ViewBuilder content パラメータを使用
  • sjui g converter 使用時のデフォルト動作

非コンテナコンポーネント

  • 子要素を持てない
  • よりシンプルな実装
  • --no-container フラグを使用

設定

sjui.config.json に追加:

{
  "extension_directory": "Extensions",
  "adapter_directory": "Extensions/Adapters"
}

🔧 技術詳細

ファイル構造

YourApp/
├── Extensions/
│   ├── MyCard.swift              # Swift コンポーネント
│   └── Adapters/
│       ├── MyCardAdapter.swift   # Dynamic アダプター
│       └── CustomComponentRegistration.swift
├── sjui_tools/
│   └── lib/
│       └── swiftui/
│           └── views/
│               └── extensions/
│                   ├── my_card_converter.rb
│                   └── converter_mappings.rb

登録

アプリ起動時の自動登録:

#if DEBUG
// App.swift または AppDelegate で
CustomComponentRegistration.registerAll()
#endif

🔄 移行ガイド

7.0.x からのアップグレード

  1. Package.swift を更新:
dependencies: [
    .package(url: "https://github.com/Tai-Kimura/SwiftJsonUI.git", from: "7.1.0")
]
  1. 破壊的変更なし: 既存のコードはそのまま動作

  2. カスタムコンポーネントの使用開始:

sjui g converter MyFirstComponent

🐛 バグ修正

  • DynamicComponent から不要な isEnabled プロパティを削除
  • すべての JSON プロパティを適切にキャプチャするよう rawData を修正
  • SwiftUI 向けのコンバーターコード生成を改善
  • 生成されたコンバーターでの文字列補間を改善

💡 ヒントとベストプラクティス

  1. シンプルに始める: 非コンテナコンポーネントから開始
  2. Swift ファイルをカスタマイズ: 生成された .swift ファイルをニーズに合わせて修正
  3. コンバーターをクリーンに保つ: 複雑なロジックは Swift コンポーネントに記述
  4. 型安全な属性を使用: 適切な型で属性を定義
  5. 両モードでテスト: Static と Dynamic の両モードで動作確認

📚 ドキュメント

新しいドキュメント

  • カスタムコンポーネントジェネレーターガイド
  • コンバーターシステムアーキテクチャ
  • アダプターパターンの説明

コマンドリファレンス

# コンポーネントを生成
sjui g converter ComponentName

# 属性付き
sjui g converter ComponentName --attributes "prop1:Type1,prop2:Type2"

# コンテナコンポーネント
sjui g converter ComponentName --container

# 非コンテナコンポーネント
sjui g converter ComponentName --no-container

# 既存を上書き
sjui g converter ComponentName --force

🚀 パフォーマンス

  • リリースビルドでのゼロオーバーヘッド: アダプターは DEBUG のみ
  • 最適化された Static モード: 直接的な Swift コード生成
  • 効率的な Dynamic モード: 最小限のアダプターレイヤー

📬 サポート


SwiftJsonUI は Tai Kimura によって開発・維持されています