-
Notifications
You must be signed in to change notification settings - Fork 0
SwiftJsonUI 7.1.0 Release Notes ja
Taichiro Kimura edited this page Apr 19, 2026
·
1 revision
2025年8月26日
SwiftJsonUI 7.1.0 では、SwiftUI 向けカスタムコンポーネントサポートを導入しました。これにより、開発者は Static モードと Dynamic モードの両方でシームレスに動作する、再利用可能なカスタムコンポーネントを作成できるようになります。
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 ビルドでのみコンパイル
# 基本的なコンポーネント
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-containerSwift コンポーネント (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
endDynamic アダプター(ホットリロード付き 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{
"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- 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 によって開発・維持されています