SwiftJsonUI 7.1.2 Release Notes ja - Tai-Kimura/SwiftJsonUI GitHub Wiki
SwiftJsonUI 7.1.2 リリースノート
リリース日
2025年8月28日
概要
SwiftJsonUI 7.1.2 では、SwiftUI 向け Collection コンポーネントに大幅な改善を加え、セクションベースのアーキテクチャ、強化されたデータバインディング、Dynamic/Static 両モードの完全サポートを実現しました。
✨ 主要な改善点
1. SwiftUI 向け CollectionDataSource の再設計
新しいセクションベースアーキテクチャ
CollectionDataSource をセクションベースのアプローチで完全に再設計:
新しい CollectionDataSection クラス:
class CollectionDataSection {
var header: (viewName: String, data: [String: Any](/Tai-Kimura/SwiftJsonUI/wiki/String:-Any))?
var cells: (viewName: String, data: [String: Any](/Tai-Kimura/SwiftJsonUI/wiki/String:-Any))?
var footer: (viewName: String, data: [String: Any](/Tai-Kimura/SwiftJsonUI/wiki/String:-Any))?
var numberOfColumns: Int = 2
}
利点:
- ✅ 1つのセルタイプで複数のデータ項目を処理可能
- ✅ セクションごとに異なるカラム数を設定可能
- ✅ セクションごとの個別ヘッダー/フッタービュー
- ✅ より柔軟なデータ管理
使用例:
let dataSource = CollectionDataSource()
// 異なる設定でセクションを作成
let section1 = CollectionDataSection()
section1.cells = ("ProductCell", productData)
section1.numberOfColumns = 3
let section2 = CollectionDataSection()
section2.cells = ("CategoryCell", categoryData)
section2.numberOfColumns = 2
section2.header = ("SectionHeader", ["title": "カテゴリー"](/Tai-Kimura/SwiftJsonUI/wiki/"title":-"カテゴリー"))
dataSource.sections = [section1, section2]
2. Static モード(コード生成)の強化
Collection コンバーターの更新
collection_converter.rb が新しいセクションアーキテクチャをサポート:
// 生成されるコードの例
ForEach(Array(viewModel.collectionDataSource.sections.enumerated()), id: \.offset) { index, section in
Section {
if let cells = section.cells?.data {
LazyVGrid(columns: columns, spacing: 10) {
ForEach(Array(cells.enumerated()), id: \.offset) { cellIndex, cellData in
buildCellView(section.cells?.viewName ?? "", cellData)
}
}
}
}
}
新機能:
cells?.dataでのオプショナルチェーン使用による安全なアクセス- 水平スクロールサポート
- スクロールインジケーター表示制御
3. Dynamic モードの Collection 表示問題の修正
解決された問題
型の不一致により Collection が Dynamic モードで表示されない問題を修正。
問題:
itemsプロパティが[String]として定義- バインディング文字列
"@{items1}"を受け取れない
解決策:
- 配列と文字列の両方を受け取れるように修正
- Dynamic モード用の適切なバインディング解決
4. Dynamic モード用 CollectionConverter の実装
完全な機能サポート
Dynamic モードコンバーターが以下をサポート:
{
"type": "Collection",
"items": "@{collectionItems}",
"sections": [
{
"cells": "ProductCell",
"columns": 3
},
{
"cells": "CategoryCell",
"columns": 2,
"header": "SectionHeader"
}
],
"layout": "horizontal",
"showsHorizontalScrollIndicator": false,
"showsVerticalScrollIndicator": true
}
機能:
- sections 属性のパース
- CollectionDataSource からのデータ取得
- セクションごとのカラム設定
- 水平レイアウトサポート (
layout: "horizontal") - スクロールインジケーター表示制御
5. 複数セクションのテストサポート
強化されたテスト機能
複雑な複数セクションレイアウトのサポートを追加:
// 例:異なるカラム数を持つ3セクション
multiSectionItems = [
Section(columns: 3, cells: "ProductCell"),
Section(columns: 2, cells: "UserCard"),
Section(columns: 4, cells: "IconCell")
]
改善点:
- セクションごとに異なるセルタイプ
- 可変カラム数(3、2、4カラム)
- セクション固有のレイアウト
6. デバッグとトラブルシューティング
強化されたデバッグログ
包括的なデバッグサポートを追加:
- FailableDecodable: デコード失敗時のデバッグログ
- DynamicDecodingHelper: コンポーネントデコードログ
- Collection 専用: 詳細なエラー特定
デバッグ出力例:
[Collection] コンポーネントをデコード中...
[Collection] items: @{items1} で正常にデコード
[Collection] セクション数: 2
[Collection] セクション 0: 3カラム、ProductCell
[Collection] セクション 1: 2カラム、CategoryCell
📋 技術的な改善
SwiftUI CollectionView 互換性
- ✅ ネイティブ SwiftUI LazyVGrid/LazyHGrid サポート
- ✅ レスポンシブレイアウト用の適切な GeometryReader 使用
- ✅ スムーズなスクロールパフォーマンス
モード間の統一された動作
- ✅ Dynamic と Static モードが同じように動作
- ✅ 両モードで同じ JSON 構造
- ✅ 一貫したレンダリング結果
レイアウトサポート
- ✅ 垂直スクロール(デフォルト)
- ✅
layout: "horizontal"での水平スクロール - ✅ スクロールインジケーターのカスタマイズ
- ✅ 適応型カラム幅
データバインディングの柔軟性
- ✅ 直接配列バインディング
- ✅
@{propertyName}での ViewModel プロパティバインディング - ✅ セクションベースのデータ整理
- ✅ 動的なセルタイプ選択
🔄 7.1.1 からの移行
Package.swift を更新
dependencies: [
.package(url: "https://github.com/Tai-Kimura/SwiftJsonUI.git", from: "7.1.2")
]
Collection の使用方法を更新
旧形式(引き続きサポート):
{
"type": "Collection",
"items": ["item1", "item2"],
"columns": 2
}
新形式(推奨):
{
"type": "Collection",
"items": "@{collectionData}",
"sections": [
{
"cells": "MyCell",
"columns": 3,
"header": "HeaderView",
"footer": "FooterView"
}
],
"showsVerticalScrollIndicator": false
}
💡 使用例
例 1: 商品グリッド
{
"type": "Collection",
"items": "@{products}",
"sections": [
{
"cells": "ProductCard",
"columns": 3
}
],
"padding": 16,
"spacing": 10
}
例 2: 水平カテゴリースクロール
{
"type": "Collection",
"items": "@{categories}",
"layout": "horizontal",
"sections": [
{
"cells": "CategoryChip",
"columns": 1
}
],
"showsHorizontalScrollIndicator": false,
"height": 50
}
例 3: 複数セクションレイアウト
{
"type": "Collection",
"items": "@{mixedContent}",
"sections": [
{
"header": "FeaturedHeader",
"cells": "FeaturedCell",
"columns": 1
},
{
"header": "PopularHeader",
"cells": "GridCell",
"columns": 2
},
{
"cells": "CompactCell",
"columns": 4,
"footer": "LoadMoreFooter"
}
]
}
🐛 バグ修正
- Dynamic モードで Collection コンポーネントが表示されない問題を修正
- items プロパティの型不一致問題を解決
- 水平スクロールレイアウトで VStack の代わりに HStack を使用するよう修正
- スクロールインジケーター表示属性を修正
- 生成コードでのセクションデータのオプショナルチェーンを修正
📚 ドキュメント更新
- Collection コンポーネントのドキュメントを更新
- セクションベースレイアウトの例を追加
- デバッグガイドを改善
- 移行手順を強化
📬 サポート
- ドキュメント: SwiftJsonUI Wiki
- 課題: GitHub Issues
- 例: Collection の例
SwiftJsonUI は木村太一朗によって開発・維持されています