SwiftUI NavigationLink 配列で他のContentViewへ遷移する話 ? その2

# リストのアコーデオン

- 2020/01/16作成

- お急ぎの方はContentView.swiftを差し替えて挙動を確認してください　

> 私のしている挙動がリストのアコーディオンで適切かどうか不明ですが長いリストの集団は前回の記事だったと思いますが? 今回は複数のリストを作成してリストを畳み込む挙動を作成しました

# 目的

> リストのアコーディオン

# 準備

- 新規でお好みの命名でSwiftUIで作成します
- ContentView.swiftを差し替える
- 画像はシステム画像を利用しています

# 少し挙動の説明

> ファイルを差し替えて起動するとtureとfalseでリストの畳み込みの違いを表現しています、遷移先はどちらも2種類ですが、どちらも同じものが表示します

# ContentView.swift

```ContentView.swift

//
//  ContentView.swift
//  SwiftUIView
//
//  Created by 福田 敏一 on 2020/01/16.
//  Copyright © 2020 株式会社パパスサン. All rights reserved.
//

import SwiftUI

struct ContentView: View {
    
    @State var showing0 = true
    @State var showing1 = false

    var body: some View {
        NavigationView {
            List {
                Section {
                    Toggle(isOn: self.$showing0) {
                        Text("リスト1")
                    }
                    ForEach(配列[0]) { 配列 in
                        if self.showing0 {
                        NavigationLink(destination: 配列.ファイル名) {
                            リスト表示(配列: 配列)
                            }
                        }
                    }
                }
                
                Section {
                    Toggle(isOn: self.$showing1) {
                        Text("リスト2")
                    }
                    ForEach(配列[1]) { 配列 in
                        if self.showing1 {
                        NavigationLink(destination: 配列.ファイル名) {
                            リスト表示(配列: 配列)
                            }
                        }
                    }
                }
            }
            .navigationBarTitle(Text("リストのアコーディオン"))
            .listStyle(GroupedListStyle())
        }
    }
    
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
    
}

struct リスト表示: View {
    var 配列: 配列L

    var body: some View {
        HStack {
            Image(systemName: 配列.画像名)
            .resizable()
            .frame(width: 64.0, height: 64.0)
            .cornerRadius(8)
            
            Text(配列.List名)
        }
    }
    
}

struct リスト表示_Previews: PreviewProvider {
    static var previews: some View {
        リスト表示(配列: 配列L.init(List名: "ContentView1へ", 画像名: "trash"))
    }
    
}

struct 配列L: Identifiable {
    var id = UUID()
    let List名: String
    var ファイル名: AnyView? = nil
    
    var 画像名: String
}

let 配列: [[配列L]] = [[
    配列L(List名: "ContentView1へ", ファイル名: AnyView(ContentView1()), 画像名: "trash"),
    配列L(List名: "ContentView2へ", ファイル名: AnyView(ContentView2()), 画像名: "arkit")
    ],[
    配列L(List名: "ContentView1へ", ファイル名: AnyView(ContentView1()), 画像名: "icloud.and.arrow.down"),
    配列L(List名: "ContentView2へ", ファイル名: AnyView(ContentView2()), 画像名: "faceid")
]]

struct ContentView1: View {
    var body: some View {
        Text("ContentView1を開いています")
    }

}

struct ContentView1_Previews: PreviewProvider {
    static var previews: some View {
        ContentView1()
    }
    
}
struct ContentView2: View {
    var body: some View {
        Text("ContentView2を開いています")
    }

}

struct ContentView2_Previews: PreviewProvider {
    static var previews: some View {
        ContentView2()
    }
    
}

```

# 私の感想と意見ですが?

> 私は理屈はわかりませんが挙動が自分の好みになれば不要なコードがあっても必要かどうかわかりませんが? 今回だけは悪戦苦闘しました以下コード

```悪戦苦闘.swift

struct リスト表示_Previews: PreviewProvider {
    static var previews: some View {
        リスト表示(配列: 配列L.init(List名: "ContentView1へ", 画像名: "trash"))
    }
    
}

```

> 「リスト表示(配列: 配列L.init(List名: "ContentView1へ", 画像名: "trash"))」の部分です
ForEach(配列[1]) { 配列 inの配列を描画に必要なので? リスト表示(配列: 配列)の引数で渡すでしょう? 大体、しかし私はいまだに? SwiftUIで重複しているコードをfunc()とかでまとめたいのでした? 理屈は不明ですが? 悪戦苦闘の末にこれでエラーは無くなりましたが私はこれで正しいかどうか? また、struct ContentView_Previews: PreviewProvider {は何に使うのか知りません?
これで新しいSwiftUIで私の好みの挙動は解決しました、なので私の会計アプリを作成できます、楽しみです

ここまで