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 つの重要なファイルを生成します:
-
Swift コンポーネント (
Extensions/MyComponent.swift)- 実際の SwiftUI View 構造体
- 生成後に完全にカスタマイズ可能
- コンテナ型と非コンテナ型の両方をサポート
-
Ruby コンバーター (
sjui_tools/lib/swiftui/views/extensions/my_component_converter.rb)- Static モード用に JSON を Swift コードに変換
- 特殊な属性を処理するためにカスタマイズ可能
- converter_mappings に自動登録
-
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 からのアップグレード
- Package.swift を更新:
dependencies: [
.package(url: "https://github.com/Tai-Kimura/SwiftJsonUI.git", from: "7.1.0")
]
-
破壊的変更なし: 既存のコードはそのまま動作
-
カスタムコンポーネントの使用開始:
sjui g converter MyFirstComponent
🐛 バグ修正
- DynamicComponent から不要な
isEnabledプロパティを削除 - すべての JSON プロパティを適切にキャプチャするよう rawData を修正
- SwiftUI 向けのコンバーターコード生成を改善
- 生成されたコンバーターでの文字列補間を改善
💡 ヒントとベストプラクティス
- シンプルに始める: 非コンテナコンポーネントから開始
- Swift ファイルをカスタマイズ: 生成された
.swiftファイルをニーズに合わせて修正 - コンバーターをクリーンに保つ: 複雑なロジックは Swift コンポーネントに記述
- 型安全な属性を使用: 適切な型で属性を定義
- 両モードでテスト: 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 Wiki
- 課題: GitHub Issues
- 例: カスタムコンポーネントの例
SwiftJsonUI は Tai Kimura によって開発・維持されています