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

SwiftJsonUI 7.1.1 リリースノート

リリース日

2025年8月27日

概要

SwiftJsonUI 7.1.1 では、カスタムコンポーネント用のバインディングプロパティを導入し、SwiftUI モードで親子コンポーネント間の双方向データバインディングを実現しました。

✨ 主な新機能

カスタムコンポーネント用バインディングプロパティ

新機能の内容

カスタムコンポーネントで双方向のデータフローを可能にするバインディングプロパティ:

  • コンポーネント生成時に属性名の先頭に @ を付けてバインディングプロパティを作成
  • JSON で @{propertyName} 構文を使用して ViewModel データにバインド
  • Static モードと Dynamic モードの両方で完全サポート
  • 型安全なバインディングのための適切な SwiftUI.Binding 生成

使用方法

1. バインディングプロパティを持つコンポーネントを生成:

sjui g converter UserProfile --attributes "@user:User,@isEditing:Bool,showDetails:Bool"

2. 生成される Swift コンポーネント:

struct UserProfile<Content: View>: View {
    @SwiftUI.Binding var user: User        // バインディングプロパティ
    @SwiftUI.Binding var isEditing: Bool   // バインディングプロパティ
    let showDetails: Bool                  // 通常のプロパティ
    let content: Content?
    
    init(
        user: SwiftUI.Binding<User>,
        isEditing: SwiftUI.Binding<Bool>,
        showDetails: Bool,
        @ViewBuilder content: () -> Content = { EmptyView() }
    ) {
        self._user = user
        self._isEditing = isEditing
        self.showDetails = showDetails
        self.content = content()
    }
    
    var body: some View {
        VStack {
            // カスタム UI をここに記述
            // バインディングプロパティの読み書きが可能
            TextField("名前", text: $user.name)
            Toggle("編集モード", isOn: $isEditing)
            if showDetails {
                Text("詳細セクション")
            }
        }
    }
}

3. JSON での使用:

{
  "type": "UserProfile",
  "user": "@{currentUser}",      // $viewModel.data.currentUser にバインド
  "isEditing": "@{editMode}",     // $viewModel.data.editMode にバインド
  "showDetails": true              // 静的な値(バインディングではない)
}

4. 親ビューでデータを定義:

{
  "data": [
    {
      "name": "currentUser",
      "class": "User",
      "defaultValue": {
        "name": "山田太郎",
        "email": "[email protected]"
      }
    },
    {
      "name": "editMode",
      "class": "Bool",
      "defaultValue": false
    }
  ],
  "child": [
    {
      "type": "UserProfile",
      "user": "@{currentUser}",
      "isEditing": "@{editMode}",
      "showDetails": true
    }
  ]
}

利点

  • 双方向データバインディング: 子コンポーネントの変更が自動的に親の状態を更新
  • 🔄 リアクティブな更新: バインドされたデータが変更されると UI が自動更新
  • 🎯 型安全性: バインディングプロパティの完全な Swift 型チェック
  • 🚀 パフォーマンス: オーバーヘッドのない効率的な SwiftUI バインディングシステム
  • 📦 シームレスな統合: 既存の SwiftJsonUI データバインディングシステムと連携

技術詳細

Static モード

Ruby コンバーターが @{propertyName} 構文を検出して生成:

UserProfile(
    user: $viewModel.data.currentUser,
    isEditing: $viewModel.data.editMode,
    showDetails: true
)

Dynamic モード

アダプターが ViewModel から適切な SwiftUI バインディングを作成:

let userBinding = Binding(
    get: { viewModel.data.currentUser as? User ?? User() },
    set: { viewModel.data.currentUser = $0 }
)

🐛 バグ修正

  • Ruby コンバーターの偽値(nil と false)の処理を修正
  • コンバーターでのバインディング式の検出を改善
  • 適切な SwiftUI.Binding サポートのためのアダプター生成を強化

📚 ドキュメント

更新されたドキュメント:

  • Converter Command ドキュメントに包括的なバインディングプロパティの例を追加
  • 属性の @ プレフィックス構文の明確な説明
  • JSON バインディング構文 @{propertyName} の使用方法
  • バインディングプロパティのユースケース

🔄 7.1.0 からの移行

破壊的変更はありません。バインディングプロパティを使用するには:

  1. Package.swift を更新:
dependencies: [
    .package(url: "https://github.com/Tai-Kimura/SwiftJsonUI.git", from: "7.1.1")
]
  1. バインディングプロパティの使用を開始:
sjui g converter MyComponent --attributes "@value:String,@isActive:Bool"

💡 ベストプラクティス

  1. 編集可能データにはバインディングを使用: ユーザーが変更できるプロパティはバインディングにする
  2. 表示のみには静的プロパティ: 読み取り専用データには通常のプロパティを使用
  3. 一貫性のある命名: プロパティの目的を示す明確な名前を使用
  4. 型安全性: バインディングプロパティには常に正しい型を指定

📬 サポート


SwiftJsonUI は木村太一朗によって開発・維持されています

⚠️ **GitHub.com Fallback** ⚠️