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 は木村太一朗によって開発・維持されています