SwiftJsonUI 7.1.1 Release Notes ja - Tai-Kimura/SwiftJsonUI GitHub Wiki
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 データバインディングシステムと連携
Ruby コンバーターが @{propertyName} 構文を検出して生成:
UserProfile(
user: $viewModel.data.currentUser,
isEditing: $viewModel.data.editMode,
showDetails: true
)アダプターが 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}の使用方法 - バインディングプロパティのユースケース
破壊的変更はありません。バインディングプロパティを使用するには:
- Package.swift を更新:
dependencies: [
.package(url: "https://github.com/Tai-Kimura/SwiftJsonUI.git", from: "7.1.1")
]- バインディングプロパティの使用を開始:
sjui g converter MyComponent --attributes "@value:String,@isActive:Bool"- 編集可能データにはバインディングを使用: ユーザーが変更できるプロパティはバインディングにする
- 表示のみには静的プロパティ: 読み取り専用データには通常のプロパティを使用
- 一貫性のある命名: プロパティの目的を示す明確な名前を使用
- 型安全性: バインディングプロパティには常に正しい型を指定
- ドキュメント: SwiftJsonUI Wiki
- 課題: GitHub Issues
- 例: カスタムコンポーネントの例
SwiftJsonUI は木村太一朗によって開発・維持されています