見出し画像

【じっくりSw1ftUI51】実践編21〜第33章 SwiftUI ナビゲーション スプリットビュー チュートリアル

さてと、前回

ナビゲーションSplitビューの基本

はやったので、今回は、

ナビゲーションSplitビューの実践チュートリアルをやってく

オイラの学びなんて関係ないって人は、

今から学ぶ内容はここに載ってるみたいだからそっちを読めばいいんじゃね😝
さてと、んだば早速〜〜〜🕺

じっくり第33章を読んでく👓

早速、動かしながら〜〜〜

まずは、今回用のSwiftUIファイルを新規で追加して

import SwiftUI

struct Essentials33: View {
    var body: some View {
        Text("Hello,E33")
    }
}

#Preview {
    Essentials33()
}
てな感じでまずはまっさらからスタート

今回用のデータモデルを作ってく🕺

あ、そうそう。本題から脱線して申し訳ないが、

データモデルって言葉が出てきたけど、

みたいなUIKit時代の本で、マニアックな方々が、FluxだのRxSwiftだの色々ゆーてるんだけど、Swiftの基本設計思想は、

MVVM(モデル-ビュー-ビューモデル)

だからね〜〜〜🕺
それ以外の、各社のアプリに特化した設計思想は、あくまでもそのサービスに特化したフレームワークではこれを使うみたいな感じなもので、

UIKitってフレームワークに特化した設計パターン

をいくら小賢しく作って悦に浸ったところで、

SwiftUIみたいな新しいフレームワークをAppleが公式フレームワーク

として出して仕舞えば、

一気に破綻するか通用しなくなる

ので、あまり特定の環境で、マニアが集まって

〇〇独自

なんて銘打って作らないようにしてね〜〜〜!
別にアプリ自体を楽しく簡単に直観的に作って、AppStoreに出せればいいだけで、APIとかフレームワークを独自に開発すること自体を目的にしてるわけでもないし、いくらそー言った面で技術力を誇示しても、それを活用したアプリ自体がわかりにくい、使いにくいなら意味はないからねん。

RxSwiftなんて、普段業務でそれを使ってて、自分たちが使ってるから、他も使えて当たり前って思い込む(努力信者の理系バカでよく居る)のは勝手だけど、RxSwiftの本自体を市販本なんかで見たことないし、そんなもんの求人を平気で出したところで、市場にそんなに人がいるわけないからね。
*ちょうど2年前の夏(すでにSwiftUIがオープンソース化されて3年くらいの時期)に実際、ビズリーチってサイトでスカウト来たけど、そんな特異なフレームワーク使う会社なんてネイティブアプリしかやらないクリエイターが行くわけない。

次世代の経験になる職場か、設計思想かも含めて、気を付ける癖は身につけてね〜〜〜(今の時代にまだ、Objective-C止まりなアプリ改修なんてやってる企業を聞くと引くレベルだから)

さてと本題に戻って〜〜〜

struct E33FruitsCategory: Identifiable, Hashable{
    let id = UUID()
    var fruitsName: String
    var drawing: [String]
}

てな感じでデータモデルを追加🕺

struct E33YaoyaCategory: Identifiable, Hashable {
    let id = UUID()
    var categoryMenu: String
    var drawings: [String]
}

八百屋さんの商品分類って感じで〜〜〜

struct Essentials33ContentsView: View {
    @State private var yaoyaCategories = [
        E33YaoyaCategory(categoryMenu: "果物", drawings: ["りんご","みかん","バナナ","葡萄","桃"]),
        E33YaoyaCategory(categoryMenu: "野菜", drawings: ["苺","レモン","いちじく"]),
        E33YaoyaCategory(categoryMenu: "その他", drawings: ["漬物"])
    ]
    
    @State private var selected: E33YaoyaCategory?
    
    @State private var columnVisibility = NavigationSplitViewVisibility.all
    
    var body: some View {
        NavigationSplitView(columnVisibility: $columnVisibility) {
            List(yaoyaCategories, selection: $selected) { menu in
                Text(menu.categoryMenu).tag(menu)
            }
        } content: {
            
        } detail: {
            
        }
        
    }
}

#Preview {
    Essentials33ContentsView()
}

てな感じで、今回のコンテンツビューも編集して〜〜〜

ここまでは出来たけども

まだ中身とか詳細がないので〜〜〜

まずは、中身列を追記

struct Essentials33ContentsView: View {
    @State private var yaoyaCategories = [
        E33YaoyaCategory(categoryMenu: "果物", drawings: ["りんご","みかん","バナナ","葡萄","桃"]),
        E33YaoyaCategory(categoryMenu: "野菜", drawings: ["苺","レモン","いちじく"]),
        E33YaoyaCategory(categoryMenu: "その他", drawings: ["漬物"])
    ]
    
    @State private var selected: E33YaoyaCategory?
    
    @State private var columnVisibility = NavigationSplitViewVisibility.all
    
    @State private var selectedDrawings: String?
    
    var body: some View {
        NavigationSplitView(columnVisibility: $columnVisibility) {
            List(yaoyaCategories, selection: $selected) { menu in
                Text(menu.categoryMenu).tag(menu)
            }
        } content: {
            if let selected {
                List(selected.drawings, id: \.self,selection: $selectedDrawings) {
                    draws in
                    HStack{
                        Image(draws)
                            .resizable()
                        Text(draws)
                    }.tag(draws)
                }
            } else {
                Text("選択してください")
            }
        } detail: {
            
        }
        
    }
}

#Preview {
    Essentials33ContentsView()
}
ここまではでけた〜〜〜🕺

次は詳細を追記〜〜〜

struct Essentials33ContentsView: View {
    @State private var yaoyaCategories = [
        E33YaoyaCategory(categoryMenu: "果物", drawings: ["りんごちゃん","みかんちゃん","バナナさん","ブドウ先輩","ピーチ姫笑"]),
        E33YaoyaCategory(categoryMenu: "野菜", drawings: ["苺","レモン","いちじく"]),
        E33YaoyaCategory(categoryMenu: "その他", drawings: ["漬物"])
    ]
    
    @State private var selected: E33YaoyaCategory?
    
    @State private var columnVisibility = NavigationSplitViewVisibility.all
    
    @State private var selectedDrawings: String?
    
    var body: some View {
        NavigationSplitView(columnVisibility: $columnVisibility) {
            List(yaoyaCategories, selection: $selected) { menu in
                Text(menu.categoryMenu).tag(menu)
            }
        } content: {
            if let selected {
                List(selected.drawings, id: \.self,selection: $selectedDrawings) {
                    draws in
                    HStack{
                        Image(draws)
                            .resizable()
                        Text(draws)
                    }.tag(draws)
                }
            } else {
                Text("選択してください")
            }
        } detail: {
            if let selectedDrawings {
                Image(selectedDrawings)
                    .resizable()
                    .aspectRatio(contentMode:.fit)
                    .padding()
            } else {
                Text("選択してください。")
            }
        }
        .navigationSplitViewStyle(.balanced)
    }
}

#Preview {
    Essentials33ContentsView()
}

てな感じで〜〜〜

別にいいけども、これだと、詳細よりもリストの画像の方がデカくなってる笑🤣

contentsのコードを

    } content: {
            if let selected {
                List(selected.drawings, id: \.self,selection: $selectedDrawings) {
                    draws in
                        Text(draws).tag(draws)
                }
            } else {
                Text("選択してください")
            }
    }

てな感じで変更してあげて!

てな感じで〜〜〜、らしくなった!😝

とまあ、本文の内容は以上かなと。

本の中では、SFSymbolsを使った例を紹介してたけど、
そんなもんよりはリストの中で、画像を表示したいって人が多いと思うので、
自分なりのコードに修正して、より実践的に使えるように
ここまでのサンプルもしてるつもりだから使ってみてね〜〜〜

大カテゴリの、野菜とその他の項目も自分で好きなように画像追加するなりして遊ぶのも良い練習になると思う🧐

今回のまとめコード

import SwiftUI

struct E33YaoyaCategory: Identifiable, Hashable {
    let id = UUID()
    var categoryMenu: String
    var drawings: [String]
}

struct Essentials33ContentsView: View {
    @State private var yaoyaCategories = [
        E33YaoyaCategory(categoryMenu: "果物", drawings: ["りんごちゃん","みかんちゃん","バナナさん","ブドウ先輩","ピーチ姫笑"]),
        E33YaoyaCategory(categoryMenu: "野菜", drawings: ["苺","レモン","いちじく"]),
        E33YaoyaCategory(categoryMenu: "その他", drawings: ["漬物"])
    ]
    
    @State private var selected: E33YaoyaCategory?
    
    @State private var columnVisibility = NavigationSplitViewVisibility.all
    
    @State private var selectedDrawings: String?
    
    var body: some View {
        NavigationSplitView(columnVisibility: $columnVisibility) {
            List(yaoyaCategories, selection: $selected) { menu in
                Text(menu.categoryMenu).tag(menu)
            }
        } content: {
            if let selected {
                List(selected.drawings, id: \.self,selection: $selectedDrawings) {
                    draws in
                        Text(draws).tag(draws)
                }
            } else {
                Text("選択してください")
            }
        } detail: {
            if let selectedDrawings {
                Image(selectedDrawings)
                    .resizable()
                    .aspectRatio(contentMode:.fit)
                    .padding()
            } else {
                Text("選択してください。")
            }
        }
        .navigationSplitViewStyle(.balanced)
    }
}

#Preview {
    Essentials33ContentsView()
}

めっちゃシンプル👀💦
シンプルの極み笑😝

Apple公式

ここのサンプルでまずは動かしてみるのもありだとは思うので、やってみてね〜〜〜

さてと、次回は

より詳細なリスト分類を作れる

第34章 SwiftUIのList、OutlineGroup、DisclosureGroupの概要

をやってく〜〜〜🕺

記事公開後、

いつもどおり、

でやった操作を〜〜〜

リストが開いて〜〜〜
果物をタップ〜〜〜
ピーチをタップすると写真が出てきて〜〜〜
てな
てな感じで
今回も結合しても問題なしまで確認でけた〜〜〜〜🕺

サンプルコード

◆Essentials33.swift

import SwiftUI
import WebKit

//タイトル
let essentialsChapter33NavigationTitle = "第33章"
let essentialsChapter33Title = "第33章 SwiftUI ナビゲーション スプリットビュー チュートリアル"
let essentialsChapter33SubTitle = "第1節 SwiftUI ナビゲーション スプリットビュー チュートリアル"

//コード
let codeEssentials33 = """
struct E33YaoyaCategory: Identifiable, Hashable {
    let id = UUID()
    var categoryMenu: String
    var drawings: [String]
}

struct Essentials33ContentsView: View {
    @State private var yaoyaCategories = [
        E33YaoyaCategory(categoryMenu: "果物", drawings: ["りんごちゃん","みかんちゃん","バナナさん","ブドウ先輩","ピーチ姫笑"]),
        E33YaoyaCategory(categoryMenu: "野菜", drawings: ["苺","レモン","いちじく"]),
        E33YaoyaCategory(categoryMenu: "その他", drawings: ["漬物"])
    ]
    
    @State private var selected: E33YaoyaCategory?
    
    @State private var columnVisibility = NavigationSplitViewVisibility.all
    
    @State private var selectedDrawings: String?
    
    var body: some View {
        NavigationSplitView(columnVisibility: $columnVisibility) {
            List(yaoyaCategories, selection: $selected) { menu in
                Text(menu.categoryMenu).tag(menu)
            }
        } content: {
            if let selected {
                List(selected.drawings, id: \\.self,selection: $selectedDrawings) {
                    draws in
                        Text(draws).tag(draws)
                }
            } else {
                Text("選択してください")
            }
        } detail: {
            if let selectedDrawings {
                Image(selectedDrawings)
                    .resizable()
                    .aspectRatio(contentMode:.fit)
                    .padding()
            } else {
                Text("選択してください。")
            }
        }
        .navigationSplitViewStyle(.balanced)
    }
}

#Preview {
    Essentials33ContentsView()
}
"""

//ポイント
let pointEssentials33 = """
あ、そうそう。本題から脱線して申し訳ないが、データモデルって言葉が出てきたけど、UIKit時代の本で、マニアックな方々が、FluxだのRxSwiftだの色々ゆーてるんだけど、Swiftの基本設計思想は、MVVM(モデル-ビュー-ビューモデル)だからね〜〜〜🕺
それ以外の、各社のアプリに特化した設計思想は、あくまでもそのサービスに特化したフレームワークではこれを使うみたいな感じなもので、UIKitってフレームワークに特化した設計パターンをいくら小賢しく作って悦に浸ったところで、SwiftUIみたいな新しいフレームワークをAppleが公式フレームワークとして出して仕舞えば、一気に破綻するか通用しなくなるので、あまり特定の環境で、マニアが集まって〇〇独自なんて銘打って作らないようにしてね〜〜〜!
別にアプリ自体を楽しく簡単に直観的に作って、AppStoreに出せればいいだけで、APIとかフレームワークを独自に開発すること自体を目的にしてるわけでもないし、いくらそー言った面で技術力を誇示しても、それを活用したアプリ自体がわかりにくい、使いにくいなら意味はないからねん。
RxSwiftなんて、普段業務でそれを使ってて、自分たちが使ってるから、他も使えて当たり前って思い込む(努力信者の理系バカでよく居る)のは勝手だけど、RxSwiftの本自体を市販本なんかで見たことないし、そんなもんの求人を平気で出したところで、市場にそんなに人がいるわけないからね。
*ちょうど2年前の夏(すでにSwiftUIがオープンソース化されて3年くらいの時期)に実際、ビズリーチってサイトでスカウト来たけど、そんな特異なフレームワーク使う会社なんてネイティブアプリしかやらないクリエイターが行くわけない。
次世代の経験になる職場か、設計思想かも含めて、気を付ける癖は身につけてね〜〜〜(今の時代にまだ、Objective-C止まりなアプリ改修なんてやってる企業を聞くと引くレベルだから)
"""
//URL
let urlEssentials33 = "https://note.com/m_kakudo/n/nb117000eebc9"

//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh33: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh33
}
//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh33{
    case Sec1
}
//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh33: [ListiOSApp17DevelopmentEssentialsCh33] = [
    ListiOSApp17DevelopmentEssentialsCh33(id: 1, title: essentialsChapter33SubTitle, view: .Sec1),
]
struct iOSApp17DevelopmentEssentialsCh33: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh33) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh33(dataiOSApp17DevelopmentEssentialsCh33: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter33NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh33(dataiOSApp17DevelopmentEssentialsCh33: ListiOSApp17DevelopmentEssentialsCh33) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh33.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials33()) {
                Text(dataiOSApp17DevelopmentEssentialsCh33.title)
            })
        }
    }
}
#Preview {
    iOSApp17DevelopmentEssentialsCh33()
}

struct Essentials33: View {
    var body: some View {
        VStack{
            TabView {
                Essentials33ContentsView()
                    .tabItem {
                        Image(systemName: contentsImageTab)
                        Text(contentsTextTab)
                    }
                Essentials33Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials33Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials33WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}
#Preview {
    Essentials33()
}

struct Essentials33Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials33)
        }
    }
}
#Preview {
    Essentials33Code()
}
struct Essentials33Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials33)
        }
    }
}
#Preview {
    Essentials33Points()
}
struct Essentials33WebView: UIViewRepresentable {
    let searchURL: URL
    func makeUIView(context: Context) -> WKWebView {
        let view = WKWebView()
        let request = URLRequest(url: searchURL)
        view.load(request)
        return view
    }
    func updateUIView(_ uiView: WKWebView, context: Context) {
        
    }
}
struct Essentials33WEB: View {
    private var url:URL = URL(string: urlEssentials33)!
    var body: some View {Essentials33WebView(searchURL: url)
    }
}
#Preview {
    Essentials33WEB()
}

struct E33YaoyaCategory: Identifiable, Hashable {
    let id = UUID()
    var categoryMenu: String
    var drawings: [String]
}

struct Essentials33ContentsView: View {
    @State private var yaoyaCategories = [
        E33YaoyaCategory(categoryMenu: "果物", drawings: ["りんごちゃん","みかんちゃん","バナナさん","ブドウ先輩","ピーチ姫笑"]),
        E33YaoyaCategory(categoryMenu: "野菜", drawings: ["苺","レモン","いちじく"]),
        E33YaoyaCategory(categoryMenu: "その他", drawings: ["漬物"])
    ]
    
    @State private var selected: E33YaoyaCategory?
    
    @State private var columnVisibility = NavigationSplitViewVisibility.all
    
    @State private var selectedDrawings: String?
    
    var body: some View {
        NavigationSplitView(columnVisibility: $columnVisibility) {
            List(yaoyaCategories, selection: $selected) { menu in
                Text(menu.categoryMenu).tag(menu)
            }
        } content: {
            if let selected {
                List(selected.drawings, id: \.self,selection: $selectedDrawings) {
                    draws in
                        Text(draws).tag(draws)
                }
            } else {
                Text("選択してください")
            }
        } detail: {
            if let selectedDrawings {
                Image(selectedDrawings)
                    .resizable()
                    .aspectRatio(contentMode:.fit)
                    .padding()
            } else {
                Text("選択してください。")
            }
        }
        .navigationSplitViewStyle(.balanced)
    }
}

#Preview {
    Essentials33ContentsView()
}

◆EssentialsMenu.swift

//フレームワーク
import SwiftUI
import WebKit

//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentials: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentials
}
//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentials {
    case Ch1
    //じっくり13で追加
    case Ch2
    //じっくり14で追加
    case Ch3
    //じっくり15で追加
    case Ch4
    //じっくり16で追加
    case Ch5
    //じっくり17で追加
    case Ch6
    //じっくり18で追加
    case Ch7
    //じっくり19で追加
    case Ch8
    //じっくり20、21で追加
    case Ch9
    //じっくり22、23で追加
    case Ch10
    //じっくり24で追加
    case Ch11
    //じっくり25で追加
    case Ch12
    //じっくり26で追加
    case Ch13
    //じっくり27,28で追加
    case Ch14
    //じっくり29で追加
    case Ch15
    //じっくり31で追加
    case Ch16
    //じっくり32で追加
    case Ch17
    //じっくり33で追加
    case Ch18
    //じっくり34で追加
    case Ch19
    //じっくり35で追加
    case Ch20
    //じっくり36で追加
    case Ch21
    //じっくり37で追加
    case Ch22
    //じっくり40で追加
    case Ch23
    //じっくり41で追加
    case Ch24
    //じっくり43で追加
    case Ch25
    //じっくり44で追加
    case Ch26
    //じっくり45で追加
    case Ch27
    //じっくり46で追加
    case Ch28
    //じっくり47で追加
    case Ch29
    //じっくり48で追加
    case Ch30
    //じっくり49で追加
    case Ch31
    //じっくり50で追加
    case Ch32
    //じっくり51で追加
    case Ch33
}
//各項目に表示する文字列
let dataiOSApp17DevelopmentEssentials: [ListiOSApp17DevelopmentEssentials] = [
    ListiOSApp17DevelopmentEssentials(id: 1, title: essentialsChapter1Title, view: .Ch1),
    //じっくり13で追加
    ListiOSApp17DevelopmentEssentials(id: 2, title: essentialsChapter2Title, view: .Ch2),
    //じっくり13で追加
    ListiOSApp17DevelopmentEssentials(id: 3, title: essentialsChapter3Title, view: .Ch3),
    //じっくり15で追加
    ListiOSApp17DevelopmentEssentials(id: 4, title: essentialsChapter4Title, view: .Ch4),
    //じっくり16で追加
    ListiOSApp17DevelopmentEssentials(id: 5, title: essentialsChapter5Title, view: .Ch5),
    //じっくり17で追加
    ListiOSApp17DevelopmentEssentials(id: 6, title: essentialsChapter6Title, view: .Ch6),
    //じっくり18で追加
    ListiOSApp17DevelopmentEssentials(id: 7, title: essentialsChapter7Title, view: .Ch7),
    //じっくり19で追加
    ListiOSApp17DevelopmentEssentials(id: 8, title: essentialsChapter8Title, view: .Ch8),
    //じっくり20、21で追加
    ListiOSApp17DevelopmentEssentials(id: 9, title: essentialsChapter9Title, view: .Ch9),
    //じっくり22、23で追加
    ListiOSApp17DevelopmentEssentials(id: 10, title: essentialsChapter10Title, view: .Ch10),
    //じっくり24で追加
    ListiOSApp17DevelopmentEssentials(id: 11, title: essentialsChapter11Title, view: .Ch11),
    //じっくり25で追加
    ListiOSApp17DevelopmentEssentials(id: 12, title: essentialsChapter12Title, view: .Ch12),
    //じっくり26で追加
    ListiOSApp17DevelopmentEssentials(id: 13, title: essentialsChapter13Title, view: .Ch13),
    //じっくり27,28で追加
    ListiOSApp17DevelopmentEssentials(id: 14, title: essentialsChapter14Title, view: .Ch14),
    //じっくり29で追加
    ListiOSApp17DevelopmentEssentials(id: 15, title: essentialsChapter15Title, view: .Ch15),
    //じっくり31で追加
    ListiOSApp17DevelopmentEssentials(id: 16, title: essentialsChapter16Title, view: .Ch16),
    //じっくり32で追加
    ListiOSApp17DevelopmentEssentials(id: 17, title: essentialsChapter17Title, view: .Ch17),
    //じっくり33で追加
    ListiOSApp17DevelopmentEssentials(id: 18, title: essentialsChapter18Title, view: .Ch18),
    //じっくり34で追加
    ListiOSApp17DevelopmentEssentials(id: 19, title: essentialsChapter19Title, view: .Ch19),
    //じっくり35で追加
    ListiOSApp17DevelopmentEssentials(id: 20, title: essentialsChapter20Title, view: .Ch20),
    //じっくり36で追加
    ListiOSApp17DevelopmentEssentials(id: 21, title: essentialsChapter21Title, view: .Ch21),
    //じっくり37で追加
    ListiOSApp17DevelopmentEssentials(id: 22, title: essentialsChapter22Title, view: .Ch22),
    //じっくり40で追加
    ListiOSApp17DevelopmentEssentials(id: 23, title: essentialsChapter23Title, view: .Ch23),
    //じっくり41で追加
    ListiOSApp17DevelopmentEssentials(id: 24, title: essentialsChapter24Title, view: .Ch24),
    //じっくり43で追加
    ListiOSApp17DevelopmentEssentials(id: 25, title: essentialsChapter25Title, view: .Ch25),
    //じっくり44で追加
    ListiOSApp17DevelopmentEssentials(id: 26, title: essentialsChapter26Title, view: .Ch26),
    //じっくり45で追加
    ListiOSApp17DevelopmentEssentials(id: 27, title: essentialsChapter27Title, view: .Ch27),
    //じっくり46で追加
    ListiOSApp17DevelopmentEssentials(id: 28, title: essentialsChapter28Title, view: .Ch28),
    //じっくり47で追加
    ListiOSApp17DevelopmentEssentials(id: 29, title: essentialsChapter29Title, view: .Ch29),
    //じっくり48で追加
    ListiOSApp17DevelopmentEssentials(id: 30, title: essentialsChapter30Title, view: .Ch30),
    //じっくり49で追加
    ListiOSApp17DevelopmentEssentials(id: 31, title: essentialsChapter31Title, view: .Ch31),
    //じっくり50で追加
    ListiOSApp17DevelopmentEssentials(id: 32, title: essentialsChapter32Title, view: .Ch32),
    //じっくり51で追加
    ListiOSApp17DevelopmentEssentials(id: 33, title: essentialsChapter33Title, view: .Ch33),
]

struct iOSApp17DevelopmentEssentials: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentials) { data in
                self.containedViewiOSApp17DevelopmentEssentials(dataiOSApp17DevelopmentEssentials: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle("iOS開発の章目次")
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentials(dataiOSApp17DevelopmentEssentials: ListiOSApp17DevelopmentEssentials) -> AnyView {
        switch dataiOSApp17DevelopmentEssentials.view {
        case .Ch1:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh1()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり13で追加
        case .Ch2:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh2()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり13で追加
        case .Ch3:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh3()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり15で追加
        case .Ch4:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh4()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり16で追加
        case .Ch5:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh5()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり17で追加
        case .Ch6:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh6()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり18で追加
        case .Ch7:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh7()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり19で追加
        case .Ch8:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh8()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり20、21で追加
        case .Ch9:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh9()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり22、23で追加
        case .Ch10:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh10()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり24で追加
        case .Ch11:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh11()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり25で追加
        case .Ch12:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh12()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり26で追加
        case .Ch13:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh13()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり27,28で追加
        case .Ch14:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh14()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり29で追加
        case .Ch15:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh15()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり31で追加
        case .Ch16:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh16()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり32で追加
        case .Ch17:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh17()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり33で追加
        case .Ch18:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh18()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり34で追加
        case .Ch19:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh19()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり35で追加
        case .Ch20:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh20()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり36で追加
        case .Ch21:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh21()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり37で追加
        case .Ch22:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh22()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり40で追加
        case .Ch23:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh23()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり41で追加
        case .Ch24:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh24()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり43で追加
        case .Ch25:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh25()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり44で追加
        case .Ch26:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh26()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり45で追加
        case .Ch27:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh27()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり46で追加
        case .Ch28:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh28()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり47で追加
        case .Ch29:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh29()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり48で追加
        case .Ch30:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh30()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり49で追加
        case .Ch31:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh31()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり50で追加
        case .Ch32:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh32()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
            //じっくり51で追加
        case .Ch33:
            return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh33()) {
                Text(dataiOSApp17DevelopmentEssentials.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentials()
}

以上🕺

後は、温泉と読書で今日もまったりしよっと〜〜〜!
さっき昼ご飯に、ウチの近所の寿司屋行ったんだけど、昔ながらの寿司でめっちゃ安くて美味しかった〜〜〜。
穴場過ぎて、繁盛して入れなかったら困るから本当にオススメな店ほど教えない(@ ̄ρ ̄@)
これからチェーン店の寿司屋とかわざわざ遠出して行く必要ないな笑😝

休みはやっぱり近所で舌鼓打ちながら、まったりが一番ええ🤤

この記事が気に入ったらサポートをしてみませんか?