見出し画像

【じっくりSw1ftUI 30】(一部有料)ちょいとブレイク UIKitとの違い=SwiftUIの旨み🕺

これまでの導入編、シンタックス編とまとめて来て結構、ファイルも増えて来たのとSwiftUIはコードベースのオブジェクト指向言語なので〜〜〜

前回までに作ったプロジェクトファイル

めっちゃ数が増えた💦

コードベースでただ、作ったオブジェクトを呼び出してるだけなので

整理後

てな感じでスッキリ整理させても〜〜〜

実行後

てな感じで、

普通に今までどおり動く
👉プロジェクトファイル内の適当なファイルに
オブジェクトを好きに配置すればいいだけ〜〜〜

さらにまとめられなくもないけど、あまりにコードが長文になりすぎても、管理しにくくなるので〜〜〜
ま、自分でやりやすいように参考にしてみてね。

コードベースでコネクションやアクションがないのが、

でやった

UIKitとの最大の違い
=SwiftUIの旨み
なので〜〜〜〜

👉ファイルまで毎回きちんと作らないといけない
って今までの記事の流れで
勘違いしてそうな人もいそうだったので、
ここで書いとくね〜〜〜

自分で整理するときは、

必ずバックアップを取る
=すぐに元に戻せるようにしといてから、
やるようにしといてね

コードテンプレートを使ってやってたのもあって、実は改行コード込みでまとめても、

ContentView.swiftの最終行
EssentialsViews.swiftの最終行
ParameterManager.swiftファイルの最終行

30+2207+2548=4785
👉5000行もないくらい


そのくらいシンプルに書けて動くって感じで、
しかも後から整理も可能ってことが分かってもらえれば十分
🕺

以下、欲しい人向けに有料でこれまでの記事のまとめ終わったコードを公開しとく〜〜〜

ま、これまでの記事で公開したコードを整理整頓してるだけだから、要らないとは思うけどね

◆ContentView.swift

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationStack{
            VStack{
                Text("iOS17アプリ開発ノート")
                    .font(.largeTitle)//サイズ
                    .foregroundStyle(.pink)//色
                    .padding(.top)//上に余白
                Spacer()
                HStack{
                    Spacer()
                    NavigationLink(
                        destination: iOSApp17DevelopmentEssentials(),
                        label: {
                                                         //↓は自分で好きな画像に変更してね
                            Image("iOSAppDevEssentials17")
                        }
                    )
                    Spacer()
                }
                Spacer()
            }
        }
    }
}

#Preview {
    ContentView()
}

◆EssentialsViews.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
}
//各項目に表示する文字列
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)
]
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)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentials()
}
//iOSApp17DevelopmentEssentialsCh1.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh1: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh1
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh1 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh1: [ListiOSApp17DevelopmentEssentialsCh1] = [
    ListiOSApp17DevelopmentEssentialsCh1(id: 1, title: essentialsChapter1SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh1: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh1) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh1(dataiOSApp17DevelopmentEssentialsCh1: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter1NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh1(dataiOSApp17DevelopmentEssentialsCh1: ListiOSApp17DevelopmentEssentialsCh1) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh1.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials1()) {
                Text(dataiOSApp17DevelopmentEssentialsCh1.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh1()
}
//iOSApp17DevelopmentEssentialsCh2.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh2: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh2
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh2 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh2: [ListiOSApp17DevelopmentEssentialsCh2] = [
    ListiOSApp17DevelopmentEssentialsCh2(id: 1, title: essentialsChapter2SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh2: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh2) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh2(dataiOSApp17DevelopmentEssentialsCh2: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter2NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh2(dataiOSApp17DevelopmentEssentialsCh2: ListiOSApp17DevelopmentEssentialsCh2) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh2.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials2()) {
                Text(dataiOSApp17DevelopmentEssentialsCh2.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh2()
}
//iOSApp17DevelopmentEssentialsCh3.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh3: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh3
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh3 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh3: [ListiOSApp17DevelopmentEssentialsCh3] = [
    ListiOSApp17DevelopmentEssentialsCh3(id: 1, title: essentialsChapter3SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh3: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh3) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh3(dataiOSApp17DevelopmentEssentialsCh3: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter3NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh3(dataiOSApp17DevelopmentEssentialsCh3: ListiOSApp17DevelopmentEssentialsCh3) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh3.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials3()) {
                Text(dataiOSApp17DevelopmentEssentialsCh3.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh3()
}
//iOSApp17DevelopmentEssentialsCh4.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh4: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh4
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh4 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh4: [ListiOSApp17DevelopmentEssentialsCh4] = [
    ListiOSApp17DevelopmentEssentialsCh4(id: 1, title: essentialsChapter4SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh4: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh4) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh4(dataiOSApp17DevelopmentEssentialsCh4: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter4NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh4(dataiOSApp17DevelopmentEssentialsCh4: ListiOSApp17DevelopmentEssentialsCh4) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh4.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials4()) {
                Text(dataiOSApp17DevelopmentEssentialsCh4.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh4()
}
//iOSApp17DevelopmentEssentialsCh5.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh5: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh5
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh5 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh5: [ListiOSApp17DevelopmentEssentialsCh5] = [
    ListiOSApp17DevelopmentEssentialsCh5(id: 1, title: essentialsChapter5SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh5: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh5) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh5(dataiOSApp17DevelopmentEssentialsCh5: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter5NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh5(dataiOSApp17DevelopmentEssentialsCh5: ListiOSApp17DevelopmentEssentialsCh5) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh5.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials5()) {
                Text(dataiOSApp17DevelopmentEssentialsCh5.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh5()
}
//iOSApp17DevelopmentEssentialsCh6.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh6: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh6
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh6 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh6: [ListiOSApp17DevelopmentEssentialsCh6] = [
    ListiOSApp17DevelopmentEssentialsCh6(id: 1, title: essentialsChapter6SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh6: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh6) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh6(dataiOSApp17DevelopmentEssentialsCh6: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter6NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh6(dataiOSApp17DevelopmentEssentialsCh6: ListiOSApp17DevelopmentEssentialsCh6) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh6.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials6()) {
                Text(dataiOSApp17DevelopmentEssentialsCh6.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh6()
}
//iOSApp17DevelopmentEssentialsCh7.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh7: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh7
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh7 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh7: [ListiOSApp17DevelopmentEssentialsCh7] = [
    ListiOSApp17DevelopmentEssentialsCh7(id: 1, title: essentialsChapter7SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh7: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh7) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh7(dataiOSApp17DevelopmentEssentialsCh7: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter7NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh7(dataiOSApp17DevelopmentEssentialsCh7: ListiOSApp17DevelopmentEssentialsCh7) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh7.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials7()) {
                Text(dataiOSApp17DevelopmentEssentialsCh7.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh7()
}
//iOSApp17DevelopmentEssentialsCh8.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh8: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh8
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh8 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh8: [ListiOSApp17DevelopmentEssentialsCh8] = [
    ListiOSApp17DevelopmentEssentialsCh8(id: 1, title: essentialsChapter8SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh8: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh8) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh8(dataiOSApp17DevelopmentEssentialsCh8: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter8NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh8(dataiOSApp17DevelopmentEssentialsCh8: ListiOSApp17DevelopmentEssentialsCh8) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh8.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials8()) {
                Text(dataiOSApp17DevelopmentEssentialsCh8.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh8()
}
//iOSApp17DevelopmentEssentialsCh9.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh9: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh9
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh9 {
    case Sec1
    case Sec2
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh9: [ListiOSApp17DevelopmentEssentialsCh9] = [
    ListiOSApp17DevelopmentEssentialsCh9(id: 1, title: essentialsChapter9_1SubTitle, view: .Sec1),
    ListiOSApp17DevelopmentEssentialsCh9(id: 2, title: essentialsChapter9_2SubTitle, view: .Sec2)
]

struct iOSApp17DevelopmentEssentialsCh9: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh9) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh9(dataiOSApp17DevelopmentEssentialsCh9: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter9NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh9(dataiOSApp17DevelopmentEssentialsCh9: ListiOSApp17DevelopmentEssentialsCh9) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh9.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials9_1()) {
                Text(dataiOSApp17DevelopmentEssentialsCh9.title)
            })
        case .Sec2:
            return AnyView(NavigationLink (destination: Essentials9_2()) {
                Text(dataiOSApp17DevelopmentEssentialsCh9.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh9()
}
//iOSApp17DevelopmentEssentialsCh10.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh10: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh8
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh10 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh10: [ListiOSApp17DevelopmentEssentialsCh10] = [
    ListiOSApp17DevelopmentEssentialsCh10(id: 1, title: essentialsChapter10SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh10: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh10) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh10(dataiOSApp17DevelopmentEssentialsCh10: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter10NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh10(dataiOSApp17DevelopmentEssentialsCh10: ListiOSApp17DevelopmentEssentialsCh10) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh10.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials10()) {
                Text(dataiOSApp17DevelopmentEssentialsCh10.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh10()
}
//iOSApp17DevelopmentEssentialsCh11.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh11: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh8
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh11 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh11: [ListiOSApp17DevelopmentEssentialsCh11] = [
    ListiOSApp17DevelopmentEssentialsCh11(id: 1, title: essentialsChapter11SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh11: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh11) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh11(dataiOSApp17DevelopmentEssentialsCh11: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter11NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh11(dataiOSApp17DevelopmentEssentialsCh11: ListiOSApp17DevelopmentEssentialsCh11) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh11.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials11()) {
                Text(dataiOSApp17DevelopmentEssentialsCh11.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh11()
}
//iOSApp17DevelopmentEssentialsCh12.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh12: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh12
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh12 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh12: [ListiOSApp17DevelopmentEssentialsCh12] = [
    ListiOSApp17DevelopmentEssentialsCh12(id: 1, title: essentialsChapter12SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh12: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh12) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh12(dataiOSApp17DevelopmentEssentialsCh12: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter12NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh12(dataiOSApp17DevelopmentEssentialsCh12: ListiOSApp17DevelopmentEssentialsCh12) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh12.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials12()) {
                Text(dataiOSApp17DevelopmentEssentialsCh12.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh12()
}
//iOSApp17DevelopmentEssentialsCh13.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh13: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh13
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh13 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh13: [ListiOSApp17DevelopmentEssentialsCh13] = [
    ListiOSApp17DevelopmentEssentialsCh13(id: 1, title: essentialsChapter13SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh13: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh13) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh13(dataiOSApp17DevelopmentEssentialsCh13: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter13NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh13(dataiOSApp17DevelopmentEssentialsCh13: ListiOSApp17DevelopmentEssentialsCh13) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh13.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials13()) {
                Text(dataiOSApp17DevelopmentEssentialsCh13.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh13()
}
//iOSApp17DevelopmentEssentialsCh14.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh14: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh14
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh14 {
    case Sec1
    case Sec2
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh14: [ListiOSApp17DevelopmentEssentialsCh14] = [
    ListiOSApp17DevelopmentEssentialsCh14(id: 1, title: essentialsChapter14_1SubTitle, view: .Sec1),
    ListiOSApp17DevelopmentEssentialsCh14(id: 2, title: essentialsChapter14_2SubTitle, view: .Sec2)
]

struct iOSApp17DevelopmentEssentialsCh14: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh14) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh14(dataiOSApp17DevelopmentEssentialsCh14: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter14NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh14(dataiOSApp17DevelopmentEssentialsCh14: ListiOSApp17DevelopmentEssentialsCh14) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh14.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials14_1()) {
                Text(dataiOSApp17DevelopmentEssentialsCh14.title)
            })
        case .Sec2:
            return AnyView(NavigationLink (destination: Essentials14_2()) {
                Text(dataiOSApp17DevelopmentEssentialsCh14.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh14()
}
//iOSApp17DevelopmentEssentialsCh15.swift
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh15: Identifiable {
    var id: Int
    var title: String
    var view: ViewEnumiOSApp17DevelopmentEssentialsCh15
}

//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh15 {
    case Sec1
}

//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh15: [ListiOSApp17DevelopmentEssentialsCh15] = [
    ListiOSApp17DevelopmentEssentialsCh15(id: 1, title: essentialsChapter15SubTitle, view: .Sec1)
]

struct iOSApp17DevelopmentEssentialsCh15: View {
    var body: some View {
        VStack {
            Divider()
            List (dataiOSApp17DevelopmentEssentialsCh15) { data in
                self.containedViewiOSApp17DevelopmentEssentialsCh15(dataiOSApp17DevelopmentEssentialsCh15: data)
            }
            .edgesIgnoringSafeArea([.bottom])
        }
        .navigationTitle(essentialsChapter15NavigationTitle)
        .navigationBarTitleDisplayMode(.inline)
    }
    //タップ後に遷移先へ遷移させる関数
    func containedViewiOSApp17DevelopmentEssentialsCh15(dataiOSApp17DevelopmentEssentialsCh15: ListiOSApp17DevelopmentEssentialsCh15) -> AnyView {
        switch dataiOSApp17DevelopmentEssentialsCh15.view {
        case .Sec1:
            return AnyView(NavigationLink (destination: Essentials15()) {
                Text(dataiOSApp17DevelopmentEssentialsCh15.title)
            })
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh15()
}

//Essentials1.swift
struct Essentials1: View {
    var body: some View {
        VStack{
            TabView {
                Essentials1Contents()
                    .tabItem {
                        Image(systemName: contentsImageTab)
                        Text(contentsTextTab)
                    }
                Essentials1Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials1WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials1()
}

struct Essentials1Contents: View {
    var body: some View {
        Text("コードなし。ポイントとリンクをクリックしてください")
    }
}

#Preview {
    Essentials1Contents()
}

struct Essentials1Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials1)
        }
    }
}

#Preview {
    Essentials1Points()
}

struct Essentials1WebView: 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 Essentials1WEB: View {
    private var url:URL = URL(string: urlEssentials1)!
    var body: some View {Essentials1WebView(searchURL: url)
    }
}

#Preview {
    Essentials1WEB()
}

//Essentials2.swift
struct Essentials2: View {
    var body: some View {
        VStack{
            TabView {
                Essentials2Contents()
                    .tabItem {
                        Image(systemName: contentsImageTab)
                        Text(contentsTextTab)
                    }
                Essentials2Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials2WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials2()
}

struct Essentials2Contents: View {
    var body: some View {
        Text("コードなし。ポイントとリンクをクリックしてください")
    }
}

#Preview {
    Essentials2Contents()
}

struct Essentials2Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials2)
        }
    }
}

#Preview {
    Essentials2Points()
}

struct Essentials2WebView: 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 Essentials2WEB: View {
    private var url:URL = URL(string: urlEssentials2)!
    var body: some View {Essentials2WebView(searchURL: url)
    }
}

#Preview {
    Essentials2WEB()
}

//Essentials3.swift
struct Essentials3: View {
    var body: some View {
        VStack{
            TabView {
                Essentials3Contents()
                    .tabItem {
                        Image(systemName: contentsImageTab)
                        Text(contentsTextTab)
                    }
                Essentials3Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials3WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials3()
}

struct Essentials3Contents: View {
    var body: some View {
        Text("コードなし。ポイントとリンクをクリックしてください")
    }
}

#Preview {
    Essentials3Contents()
}

struct Essentials3Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials3)
        }
    }
}

#Preview {
    Essentials3Points()
}

struct Essentials3WebView: 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 Essentials3WEB: View {
    private var url:URL = URL(string: urlEssentials3)!
    var body: some View {Essentials3WebView(searchURL: url)
    }
}

#Preview {
    Essentials3WEB()
}

//Essentials4.swift
struct Essentials4: View {
    var body: some View {
        VStack{
            TabView {
                Essentials4Contents()
                    .tabItem {
                        Image(systemName: contentsImageTab)
                        Text(contentsTextTab)
                    }
                Essentials4Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials4Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials4WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials4()
}

struct Essentials4Contents: View {
    @State private var rotation4_3: Double = 0
    
    var body: some View {
        VStack{
            Rectangle()
                .fill(Color.yellow)
                .frame(width: 300, height: 300)
                .rotationEffect(.degrees(rotation4_3))
                .animation(.bouncy(duration: 2), value: rotation4_3)
            Button(action: {
                rotation4_3 = (rotation4_3 < 360 ? rotation4_3 + 45 : 0)
            }){
                if rotation4_3 < 90 {
                    Text("オイラの四角形")
                        .foregroundColor(Color.red)
                } else {
                    Text("オイラの四角形")
                        .foregroundColor(Color.green)
                }
            }
        }
        .padding()
    }
}

#Preview {
    Essentials4Contents()
}

struct Essentials4Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials4)
        }
    }
}

#Preview {
    Essentials4Code()
}

struct Essentials4Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials4)
        }
    }
}

#Preview {
    Essentials4Points()
}

struct Essentials4WebView: 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 Essentials4WEB: View {
    private var url:URL = URL(string: urlEssentials4)!
    var body: some View {Essentials4WebView(searchURL: url)
    }
}

#Preview {
    Essentials4WEB()
}

//Essentials5.swift
struct Essentials5: View {
    var body: some View {
        VStack{
            TabView {
                Essentials5Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials5Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials5WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials5()
}

struct Essentials5Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials5)
        }
    }
}

#Preview {
    Essentials5Code()
}

struct Essentials5Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials5)
        }
    }
}

#Preview {
    Essentials5Points()
}

struct Essentials5WebView: 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 Essentials5WEB: View {
    private var url:URL = URL(string: urlEssentials5)!
    var body: some View {
        Essentials5WebView(searchURL: url)
    }
}

#Preview {
    Essentials5WEB()
}

//Essentials6.swift
struct Essentials6: View {
    var body: some View {
        VStack{
            TabView {
                Essentials6Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials6Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials6WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials6()
}

struct Essentials6Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials6)
        }
    }
}

#Preview {
    Essentials6Code()
}

struct Essentials6Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials6)
        }
    }
}

#Preview {
    Essentials6Points()
}

struct Essentials6WebView: 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 Essentials6WEB: View {
    private var url:URL = URL(string: urlEssentials6)!
    var body: some View {
        Essentials6WebView(searchURL: url)
    }
}

#Preview {
    Essentials6WEB()
}

//Essentials7.swift
struct Essentials7: View {
    var body: some View {
        VStack{
            TabView {
                Essentials7Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials7Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials7WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials7()
}

struct Essentials7Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials7)
        }
    }
}

#Preview {
    Essentials7Code()
}

struct Essentials7Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials7)
        }
    }
}

#Preview {
    Essentials7Points()
}

struct Essentials7WebView: 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 Essentials7WEB: View {
    private var url:URL = URL(string: urlEssentials7)!
    var body: some View {
        Essentials7WebView(searchURL: url)
    }
}

#Preview {
    Essentials7WEB()
}

//Essentials8.swift
struct Essentials8: View {
    var body: some View {
        VStack{
            TabView {
                Essentials8Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials8Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials8WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials8()
}

struct Essentials8Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials8)
        }
    }
}

#Preview {
    Essentials8Code()
}

struct Essentials8Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials8)
        }
    }
}

#Preview {
    Essentials8Points()
}

struct Essentials8WebView: 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 Essentials8WEB: View {
    private var url:URL = URL(string: urlEssentials8)!
    var body: some View {
        Essentials8WebView(searchURL: url)
    }
}

#Preview {
    Essentials8WEB()
}

//Essentials9_1.swift
struct Essentials9_1: View {
    var body: some View {
        VStack{
            TabView {
                Essentials9_1Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials9_1Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials9_1WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials9_1()
}

struct Essentials9_1Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials9_1)
        }
    }
}

#Preview {
    Essentials9_1Code()
}

struct Essentials9_1Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials9_1)
        }
    }
}

#Preview {
    Essentials9_1Points()
}

struct Essentials9_1WebView: 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 Essentials9_1WEB: View {
    private var url:URL = URL(string: urlEssentials9_1)!
    var body: some View {
        Essentials9_1WebView(searchURL: url)
    }
}

#Preview {
    Essentials9_1WEB()
}

//Essentials9_2.swift
struct Essentials9_2: View {
    var body: some View {
        VStack{
            TabView {
                Essentials9_2Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials9_2Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials9_2WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials9_2()
}

struct Essentials9_2Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials9_2)
        }
    }
}

#Preview {
    Essentials9_2Code()
}

struct Essentials9_2Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials9_2)
        }
    }
}

#Preview {
    Essentials9_2Points()
}

struct Essentials9_2WebView: 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 Essentials9_2WEB: View {
    private var url:URL = URL(string: urlEssentials9_2)!
    var body: some View {
        Essentials9_2WebView(searchURL: url)
    }
}

#Preview {
    Essentials9_2WEB()
}

//Essentials10.swift
struct Essentials10: View {
    var body: some View {
        VStack{
            TabView {
                Essentials10Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials10Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials10WEB1()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
                Essentials10WEB2()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials10()
}

struct Essentials10Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials10)
        }
    }
}

#Preview {
    Essentials10Code()
}

struct Essentials10Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials10)
        }
    }
}

#Preview {
    Essentials10Points()
}

struct Essentials10WebView1: 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 Essentials10WEB1: View {
    private var url:URL = URL(string: urlEssentials10_1)!
    var body: some View {
        Essentials10WebView1(searchURL: url)
    }
}

#Preview {
    Essentials10WEB1()
}

struct Essentials10WebView2: 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 Essentials10WEB2: View {
    private var url:URL = URL(string: urlEssentials10_2)!
    var body: some View {
        Essentials10WebView2(searchURL: url)
    }
}

#Preview {
    Essentials10WEB2()
}

//Essentials11.swift
struct Essentials11: View {
    var body: some View {
        VStack{
            TabView {
                Essentials11Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials11Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials11WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials11()
}

struct Essentials11Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials11)
        }
    }
}

#Preview {
    Essentials11Code()
}

struct Essentials11Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials11)
        }
    }
}

#Preview {
    Essentials11Points()
}

struct Essentials11WebView: 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 Essentials11WEB: View {
    private var url:URL = URL(string: urlEssentials11)!
    var body: some View {
        Essentials11WebView(searchURL: url)
    }
}

#Preview {
    Essentials11WEB()
}

//Essentials12.swift
struct Essentials12: View {
    var body: some View {
        VStack{
            TabView {
                Essentials12Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials12Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials12WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials12()
}

struct Essentials12Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials12)
        }
    }
}

#Preview {
    Essentials12Code()
}

struct Essentials12Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials12)
        }
    }
}

#Preview {
    Essentials12Points()
}

struct Essentials12WebView: 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 Essentials12WEB: View {
    private var url:URL = URL(string: urlEssentials12)!
    var body: some View {
        Essentials12WebView(searchURL: url)
    }
}

#Preview {
    Essentials12WEB()
}

//Essentials13.swift
struct Essentials13: View {
    var body: some View {
        VStack{
            TabView {
                Essentials13Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials13Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials13WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials13()
}

struct Essentials13Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials13)
        }
    }
}

#Preview {
    Essentials13Code()
}

struct Essentials13Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials13)
        }
    }
}

#Preview {
    Essentials13Points()
}

struct Essentials13WebView: 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 Essentials13WEB: View {
    private var url:URL = URL(string: urlEssentials13)!
    var body: some View {
        Essentials13WebView(searchURL: url)
    }
}

#Preview {
    Essentials13WEB()
}

//Essentials14_1.swift
struct Essentials14_1: View {
    var body: some View {
        VStack{
            TabView {
                Essentials14_1Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials14_1Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials14_1WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials14_1()
}

struct Essentials14_1Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials14_1)
        }
    }
}

#Preview {
    Essentials14_1Code()
}

struct Essentials14_1Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials14_1)
        }
    }
}

#Preview {
    Essentials14_1Points()
}

struct Essentials14_1WebView: 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 Essentials14_1WEB: View {
    private var url:URL = URL(string: urlEssentials14_1)!
    var body: some View {
        Essentials14_1WebView(searchURL: url)
    }
}

#Preview {
    Essentials14_1WEB()
}

//Essentials14_2.swift
struct Essentials14_2: View {
    var body: some View {
        VStack{
            TabView {
                Essentials14_2Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials14_2Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials14_2WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}

#Preview {
    Essentials14_2()
}
struct Essentials14_2Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials14_2)
        }
    }
}
#Preview {
    Essentials14_2Code()
}
struct Essentials14_2Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials14_2)
        }
    }
}
#Preview {
    Essentials14_2Points()
}
struct Essentials14_2WebView: 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 Essentials14_2WEB: View {
    private var url:URL = URL(string: urlEssentials14_2)!
    var body: some View {
        Essentials14_2WebView(searchURL: url)
    }
}
#Preview {
    Essentials14_2WEB()
}

//Essentials15.swift
struct Essentials15: View {
    var body: some View {
        VStack{
            TabView {
                Essentials15Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                Essentials15Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
                Essentials15WEB()
                    .tabItem {
                        Image(systemName: webImageTab)
                        Text(webTextTab)
                    }
            }
        }
    }
}
#Preview {
    Essentials15()
}
struct Essentials15Code: View {
    var body: some View {
        ScrollView{
            Text(codeEssentials15)
        }
    }
}
#Preview {
    Essentials15Code()
}
struct Essentials15Points: View {
    var body: some View {
        ScrollView{
            Text(pointEssentials15)
        }
    }
}
#Preview {
    Essentials15Points()
}
struct Essentials15WebView: 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 Essentials15WEB: View {
    private var url:URL = URL(string: urlEssentials15)!
    var body: some View {
        Essentials15WebView(searchURL: url)
    }
}
#Preview {
    Essentials15WEB()
}

◆ParameterManager.swift

import Foundation
//Tab
let contentsImageTab = "hand.thumbsup"
let contentsTextTab = "動作確認"
let codeImageTab = "a.square"
let codeTextTab = "コード"
let pointImageTab = "star"
let pointTextTab = "ポイント"
let webImageTab = "link"
let webTextTab = "参考リンク"

//タイトル
let essentialsChapter1NavigationTitle = "第1章"
let essentialsChapter1Title = "第1章 iOS17アプリ開発の基礎の概要"
let essentialsChapter1SubTitle = "第1節 iOS17アプリ開発の基礎の概要"
let essentialsChapter2NavigationTitle = "第2章"
let essentialsChapter2Title = "第2章 AppleDeveloperProgramに参加する方法"
let essentialsChapter2SubTitle = "第1節 AppleDeveloperProgramに参加する方法"
let essentialsChapter3NavigationTitle = "第3章"
let essentialsChapter3Title = "第3章 Xcode15とiOS17SDKのインストール"
let essentialsChapter3SubTitle = "第1節 Xcode15とiOS17SDKのインストール"
let essentialsChapter4NavigationTitle = "第4章"
let essentialsChapter4Title = "第4章 Xcode15プレイグラウンドの概要"
let essentialsChapter4SubTitle = "第1節 Xcode15プレイグラウンドの概要"
let essentialsChapter5NavigationTitle = "第5章"
let essentialsChapter5Title = "第5章 Swiftデータ型、定数、変数"
let essentialsChapter5SubTitle = "第1節 Swiftデータ型、定数、変数"
let essentialsChapter6NavigationTitle = "第6章"
let essentialsChapter6Title = "第6章 Swift演算子と式"
let essentialsChapter6SubTitle = "第1節 Swift演算子と式"
let essentialsChapter7NavigationTitle = "第7章"
let essentialsChapter7Title = "第7章 迅速な制御フロー"
let essentialsChapter7SubTitle = "第1節 迅速な制御フロー"
let essentialsChapter8NavigationTitle = "第8章"
let essentialsChapter8Title = "第8章 Swift Switchステートメント"
let essentialsChapter8SubTitle = "第1節 Swift Switchステートメント"
let essentialsChapter9NavigationTitle = "第9章"
let essentialsChapter9Title = "第9章 Swift の関数、メソッド、クロージャ"
let essentialsChapter9_1SubTitle = "第1節 ファンクション(function)"
let essentialsChapter9_2SubTitle = "第2節 クロージャ(closure)"
let essentialsChapter10NavigationTitle = "第10章"
let essentialsChapter10Title = "第10章 Swiftオブジェクト指向プログラミングの基礎"
let essentialsChapter10SubTitle = "第1節 Swiftオブジェクト指向プログラミングの基礎"
let essentialsChapter11NavigationTitle = "第11章"
let essentialsChapter11Title = "第11章 Swiftのサブクラス化と拡張機能の概要"
let essentialsChapter11SubTitle = "第1節 Swiftのサブクラス化と拡張機能の概要"
let essentialsChapter12NavigationTitle = "第12章"
let essentialsChapter12Title = "第12章 Swift構造と列挙の概要"
let essentialsChapter12SubTitle = "第1節 Swift構造と列挙の概要"
let essentialsChapter13NavigationTitle = "第13章"
let essentialsChapter13Title = "第13章 プロパティラッパー"
let essentialsChapter13SubTitle = "第1節 プロパティラッパー"
let essentialsChapter14NavigationTitle = "第14章"
let essentialsChapter14Title = "第14章 コレクション:配列と辞書(ディクショナリ)"
let essentialsChapter14_1SubTitle = "第1節 配列"
let essentialsChapter14_2SubTitle = "第2節 辞書(ディクショナリ)"
let essentialsChapter15NavigationTitle = "第15章"
let essentialsChapter15Title = "第15章 エラーハンドリング"
let essentialsChapter15SubTitle = "第1節 エラーハンドリング"

//コード
let codeSwiftUIMasterMindsiOS17Ch1Sec1 = """
import SwiftUI

struct SwiftUIMasterMindsiOS17Ch1Sec1: View {
    var body: some View {
        VStack{
            TabView {
                SwiftUIMasterMindsiOS17Ch1Sec1Contents()
                    .tabItem {
                        Image(systemName: contentsImageTab)
                        Text(contentsTextTab)
                    }
                SwiftUIMasterMindsiOS17Ch1Sec1Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                SwiftUIMasterMindsiOS17Ch1Sec1Point()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
            }
        }
    }
}

#Preview {
    SwiftUIMasterMindsiOS17Ch1Sec1()
}

struct SwiftUIMasterMindsiOS17Ch1Sec1Contents: View {
    var body: some View {
        Text("内容")
    }
}

#Preview {
    SwiftUIMasterMindsiOS17Ch1Sec1Contents()
}

struct SwiftUIMasterMindsiOS17Ch1Sec1Code: View {
    var body: some View {
        ScrollView{
            Text(codeSwiftUIMasterMindsiOS17Ch1Sec1)
        }
    }
}

#Preview {
    SwiftUIMasterMindsiOS17Ch1Sec1Code()
}

struct SwiftUIMasterMindsiOS17Ch1Sec1Point: View {
    var body: some View {
        Text("ポイント")
    }
}

#Preview {
    SwiftUIMasterMindsiOS17Ch1Sec1Point()
}

"""

let codeiOSApp17DevelopmentEssentialsCh1Sec1 = """
import SwiftUI

struct iOSApp17DevelopmentEssentialsCh1Sec1: View {
    var body: some View {
        VStack{
            TabView {
                iOSApp17DevelopmentEssentialsCh1Sec1Contents()
                    .tabItem {
                        Image(systemName: contentsImageTab)
                        Text(contentsTextTab)
                    }
                iOSApp17DevelopmentEssentialsCh1Sec1Code()
                    .tabItem {
                        Image(systemName: codeImageTab)
                        Text(codeTextTab)
                    }
                iOSApp17DevelopmentEssentialsCh1Sec1Points()
                    .tabItem {
                        Image(systemName: pointImageTab)
                        Text(pointTextTab)
                    }
            }
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh1Sec1()
}

struct iOSApp17DevelopmentEssentialsCh1Sec1Contents: View {
    var body: some View {
        Text("機能")
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh1Sec1Contents()
}

struct iOSApp17DevelopmentEssentialsCh1Sec1Code: View {
    var body: some View {
        ScrollView{
            Text(codeiOSApp17DevelopmentEssentialsCh1Sec1)
        }
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh1Sec1Code()
}

struct iOSApp17DevelopmentEssentialsCh1Sec1Points: View {
    var body: some View {
        Text("ポイント")
    }
}

#Preview {
    iOSApp17DevelopmentEssentialsCh1Sec1Points()
}
"""

let codeEssentials4 = """
◼️Untitle Page
//最初からあるコード
import UIKit
//じっくり14で追加
import SwiftUI
//じっくり15で追加
import PlaygroundSupport

//最初からあるコード
var greeting = "Hello, playground"
//じっくり14で追加
print(greeting)

//じっくり15で追加
//iOSAppsDevsEssentials第4章
//一番シンプルなコード
var greeting4_1 = "Let's Playground"
print(greeting4_1)

/*
 繰り返しを使って
 Quick Look機能で処理結果の推移
 を確認できる
 */
//じっくり15で追加
var x4_2 = 1
for idx4_2 in 1...2300 {
    let y4_2 = idx4_2 * x4_2
    x4_2 += 1
}
//じっくり15で追加

/*:
 # 新装開店 M_Kaku堂定食へようこそ
 * ○月×日に新装開店しました
 * 当店の売りは **SwiftUI定食 (ご飯の量は選べます) デザート付きで、2000円**
 * お問い合わせ先は、*profile* をご確認ください
 */
struct RectangleView4_3: View {
    
    @State private var rotation4_3: Double = 0
    
    var body: some View {
        VStack{
            Rectangle()
                .fill(Color.yellow)
                .frame(width: 300, height: 300)
                .rotationEffect(.degrees(rotation4_3))
                .animation(.bouncy(duration: 2), value: rotation4_3)
            Button(action: {
                rotation4_3 = (rotation4_3 < 360 ? rotation4_3 + 45 : 0)
            }){
                if rotation4_3 < 90 {
                    Text("オイラの四角形")
                        .foregroundColor(Color.red)
                } else {
                    Text("オイラの四角形")
                        .foregroundColor(Color.green)
                }
            }
        }
        .padding()
    }
}

PlaygroundPage.current.setLiveView(RectangleView4_3().padding(100))
◼️SwiftUITraining
import UIKit
import SwiftUI
import PlaygroundSupport

struct CircleView4_3: View {
    var body: some View {
        VStack{
            Circle()
                .fill(Color.green)
                .frame(width: 300, height: 300)
            Button(action: {
                
            }){
                Text("オイラのサークル")
            }
        }
        .padding()
    }
}

PlaygroundPage.current.setLiveView(CircleView4_3().padding(100))
//: [Next](@next)

"""

let codeEssentials5 = """
/**:---------------------------------------------------------------------------------------------------------------------------------
  じっくり 第5章
 -------------------------------------------------------------------------------------------------------------------------------------*/

var number5_1 = 20
//Int8の最小〜最大
print("Int8は最小:\(Int8.min)〜最大:\(Int8.max)")
//Int16の最小〜最大
print("Int16は最小:\(Int16.min)〜最大:\(Int16.max)")
//Int32の最小〜最大
print("Int32は最小:\(Int32.min)〜最大:\(Int32.max)")
//Int64の最小〜最大
print("Int64は最小:\(Int64.min)〜最大:\(Int64.max)")
//Float16
var float5_2_1: Float16 = 5432.1234
//Float32
var float5_2_2: Float32 = 5432.1234
//Float64
var float5_2_3: Float64 = 5432.1234
//Float16出力
print("Float16だと、\\(float5_2_1)")
//Float32出力
print("Float32だと、\\(float5_2_2)")
//Float64出力
print("Float64だと、\\(float5_2_3)")
//Bool型
//定価
var price: Double = 10000
//税込価格
var sumPrice: Double = price * customerTax
//真偽フラグ
var over10000: Bool = true
//もし、1万円以下なら
if sumPrice <= 10000 {
    print("税込価格は、\\(sumPrice)円")
    //falseを返せ
    print(!over10000)
} else {
    print("税込価格は、\\(sumPrice)円")
    //trueを返せ
    print(over10000)
}
//文字列型
//1文字
let male5_4_1: Character = "男"
let female5_4_1: Character = "女"
print("日本の銭湯は一般的に\\(male5_4_1)湯と \\(female5_4_1)湯に分かれています。")
//Unicodeで旧Twitterの会社名を表示
let oldTwitter5_4 : Character = "\u{0058}"
print("旧Twitterは\\(oldTwitter5_4)に変わりました。")
//複数文字
var companyName5_4 : String = "facebook"
let newCompanyName5_4 : String = "Meta"
print("会社名は\\(companyName5_4)")
companyName5_4 = newCompanyName5_4
print("会社名は\\(companyName5_4)")

//特殊文字の使用例
//1文字
let male5_5_1: Character = "男"
let female5_5_1: Character = "女"
//改行文字
print("日本の銭湯は一般的に\\(male5_5_1)湯と\n\\(female5_5_1)湯に分かれています。")
//Unicodeで旧Twitterの会社名を表示
let oldTwitter5_5 : Character = "\u{0058}"
//水平タブ
print("旧Twitterは、\n\t\\(oldTwitter5_5)\tに変わりました。")

let male5_6_1 = "男"
let female5_6_1 = "女"
print("日本の銭湯は一般的に\\(male5_6_1)湯と\\(female5_6_1)湯に分かれています。")

//定価
var price5_6_2 = 10000
//消費税
let customerTax = 1.10
//税込価格
var sumPrice5_6_2 = Double(price5_6_2) * customerTax
//真偽フラグ
var over100005_6_2 = true
//もし、1万円以下なら
if sumPrice5_6_2 <= 10000 {
    print("税込価格は、\\(sumPrice5_6_2)円")
    //falseを返せ
    print(!over100005_6_2)
} else {
    print("税込価格は、\\(sumPrice5_6_2)円")
    //trueを返せ
    print(over100005_6_2)
}

//タプル
var tuple5_7_1 = (10.0, "M_Kaku堂")
var kakuString5_7_1 = tuple5_7_1.1
print(kakuString5_7_1)
tuple5_7_1.0 = 12
print(tuple5_7_1)

var tuple5_7_2 = (count:10.0,name:"M_Kaku堂")
print("タプルの名前要素は、\\(tuple5_7_2.name)")

//オプショナル型
var int5_8_1: Int?
//追加
int5_8_1 = 10

if int5_8_1 != nil {
    print("nil以外だぞ")
} else {
    print("nilだぞ")
}

//強制アンラップ
//オプショナル型変数
var idx5_8_2: Int?

idx5_8_2 = 3

var array5_8_2 = ["りんご","ゴリラ","ラッパ","パン"]
if idx5_8_2 != nil {
    print(array5_8_2[idx5_8_2!])
} else {
    print("\\(String(describing: idx5_8_2))の値がないぞ")
}

var idx5_8_3: Int?

idx5_8_3 = 2

var array5_8_3 = ["りんご","ゴリラ","ラッパ","パン"]
//変数で宣言
if var varValue5_8_3 = idx5_8_3 {
    print(array5_8_3[varValue5_8_3])
} else {
    print("値がないぞ")
}

var idx5_8_4: Int?

idx5_8_4 = 1

var array5_8_4 = ["りんご","ゴリラ","ラッパ","パン"]

if let idx5_8_4 = idx5_8_4 {
    print(array5_8_4[idx5_8_4])
} else {
    print("値がないぞ")
}

var idx5_8_5: Int?

idx5_8_5 = 0

var array5_8_5 = ["りんご","ゴリラ","ラッパ","パン"]

if let idx5_8_5 {
    print(array5_8_5[idx5_8_5])
} else {
    print("値がないぞ")
}

var menu1_5_9 : String?
var menu2_5_9 : String?

menu1_5_9 = "カツ丼"
menu2_5_9 = "天丼"

if let menu1_5_9, let menu2_5_9 {
    print("\\(menu1_5_9)にはうどんが付きます")
    print("\\(menu2_5_9)には蕎麦が付きます")
} else {
    print("以外は単品のみです")
}

var idx5_10: Int!

idx5_10 = 3

var array5_10 = ["りんご","ゴリラ","ラッパ","パン"]
if idx5_10 != nil {
    print(array5_10[idx5_10])
} else {
    print("値がないぞ")
}

var string5_11: String? = nil
var int5_11: Int? = nil
var double5_11: Double? = nil

"""

let codeEssentials6 = """
/**:-------------------------------------------
  Essentials 第6章
 ----------------------------------------------*/
//Basic expression

var sum6_1 = 1 + 1

//定数で足し算
let sum6_2 = 1 + 1

//代入式
//オプショナル型で表現
var a6_3: Int?
var b6_3 = 10
//値を代入
a6_3 = 21
//出力
print(a6_3!)
//強制アンラップして、加算
a6_3 = a6_3! + b6_3
//出力
print(a6_3!)
//bにaを代入
b6_3 = a6_3!
//出力。bはオプショナル型じゃないので強制アンラップ不要
print(b6_3)

//足し算
var x6_4 = 20
var y6_4 = -1
x6_4 = x6_4 + y6_4
print(x6_4)


//マイナスの値を足し算で表記
var x6_5 = 20
var y6_5 = 1
x6_5 = x6_5 + -(y6_5)
print(x6_5)

//掛け算
var x6_6 = 20
var y6_6 = 1
x6_6 = x6_6 * -(y6_6)
print(x6_6)

//割り算
var x6_7 = 20
var y6_7 = 7
x6_7 = x6_7 / -(y6_7)
print(x6_7)

//余り
var x6_8 = 20
var y6_8 = 7
x6_8 = x6_8 % -(y6_8)
print(x6_8)

//優先順位
var x6_9 = 20
//掛けられる数
var y6_9 = 7
var z6_9 = 35
//掛ける数
var multipleValue = 15 + z6_9 + -(4/2)
x6_9 = y6_9 * multipleValue
print(x6_9)

//別表記
var x6_10 = 20
var y6_10 = 7
x6_10 += y6_10
print(x6_10)
x6_10 = 20 //初期値に戻す
x6_10 -= y6_10
print(x6_10)
x6_10 = 20 //初期値に戻す
x6_10 *= y6_10
print(x6_10)
x6_10 = 20 //初期値に戻す
x6_10 /= y6_10
print(x6_10)
x6_10 = 20 //初期値に戻す
x6_10 %= y6_10
print(x6_10)

//比較演算子
var result6_11: Bool? //比較結果の変数(インスタンス)を作っておいて
var x6_11 = 20
var y6_11 = 7
//大
result6_11 = x6_11 > y6_11
print(result6_11!)
//小
result6_11 = x6_11 < y6_11
print(result6_11!)
//以上
result6_11 = x6_11 >= y6_11
print(result6_11!)
//以下
result6_11 = x6_11 <= y6_11
print(result6_11!)
//等しい
result6_11 = x6_11 == y6_11
print(result6_11!)
//違う
result6_11 = x6_11 != y6_11
print(result6_11!)

//論理演算子:排他
var x6_12 = 20
var y6_12 = 10
    //じゃなければ
if x6_12 != y6_12 {
    print("同じじゃないぞ")
    //以外であれば
} else {
    print("同じだぞ")
}

//論理演算子:かつ
var x6_13 = 20
var y6_13 = 10
    //いずれも満たしてる場合
if (x6_13 < y6_13) && (x6_13 > y6_13) {
    print("満たしてるぞ")
    //以外であれば
} else {
    print("満たしてないぞ")
}

//論理演算子:または
var x6_14 = 20
var y6_14 = 10
    //いずれかを満たしてる場合
if (x6_14 < y6_14) || (x6_14 > y6_14) {
    print("満たしてるぞ")
    //以外であれば
} else {
    print("満たしてないぞ")
}

//範囲演算子
var x6_15 = 1
var y6_15 = 5
var z6_15 = 2
//未満
for n in x6_15..<y6_15 {
    print("\\(n)回目の計算前のZの値は、\\(z6_15)")
    print("今は、\\(n)回目")
    z6_15 += n
    print("\\(n)回目の計算結果は、\\(z6_15)")
}
//指定した値まで含んで繰り返す
for n in x6_15...y6_15 {
    print("\\(n)回目の計算前のZの値は、\\(z6_15)")
    print("今は、\\(n)回目")
    z6_15 += n
    print("\\(n)回目の計算結果は、\\(z6_15)")
}

//教室事例:最後を含まない
var sum6_16 = 1
for n in 0..<100 {
    sum6_16 += n
}
let comsumerTax6_16 = 1.1
let price6_16: Double = 121
var result6_16: Double
result6_16 = price6_16 * Double(sum6_16) * comsumerTax6_16
print(result6_16)

//教室事例:最後を含む
var sum6_17 = 1
for n in 0...100 {
    sum6_17 += n
}
let comsumerTax6_17 = 1.1
let price6_17: Double = 121
var result6_17: Double
result6_17 = price6_17 * Double(sum6_17) * comsumerTax6_17
print(result6_17)

//三項演算子
var a6_18 = 1
var b6_18 = 2
//条件に一致した時だけ掛け算
print(a6_18 < b6_18 ? a6_18 * b6_18 : "")

//nil融合演算子
var item6_19: String? = nil
print("商品は、\\(item6_19 ?? "nilだぞ") ")

//Bitwise演算子
//Not
let a6_20 = 23
let b = ~a6_20
print(b)
//AND
let x6_21 = 14
let y6_21 = 23
let z6_21 = x6_21 & y6_21
print(z6_21)
//OR
let x6_22 = 14
let y6_22 = 23
let z6_22 = x6_22 | y6_22
print(z6_22)
//XOR
let x6_23 = 14
let y6_23 = 23
let z6_23 = x6_23 ^ y6_23
print(z6_23)
//LEFTShift
let x6_24 = 14
let y6_24 = x6_24 << 1
print(y6_24)
//RightShift
let x6_25 = 14
let y6_25 = x6_24 >> 1
print(y6_25)

//Bitwise演算子別の書き方
var x6_26 = 14
var y6_26 = 23
//AND
x6_26 &= y6_23
print(x6_26)
//OR
x6_26 |= y6_23
print(x6_26)
//XOR
x6_26 ^= y6_23
print(x6_26)
//LEFTShift
x6_26 <<= y6_23
print(x6_26)
//RightShift
x6_26 >>= y6_23
print(x6_26)
"""

let codeEssentials7 = """
/**:-------------------------------------------
  Essentials 第7章
 ----------------------------------------------*/
//for基本
var sum7_1 = 1
for cnt7_1 in 1...99 {
    sum7_1 += cnt7_1
    print("合計は、\\(sum7_1)です")
}

//省略
var sum7_2 = 0
for _ in 1...100 {
    sum7_2 += 1
    print("合計は、\\(sum7_2)です")
}

//省略しない
var sum7_3 = 0
for cnt7_3 in 1...100 {
    sum7_3 += 1
    if cnt7_3 > 50 {
        print("回数は\\(cnt7_3)で、合計は、\\(sum7_3)です")
    } else {
        print("合計は、\\(sum7_3)です")
    }
}

//while文
var num7_4 = 3
var cnt7_4 = 1
while cnt7_4 < 10 {
    num7_4 *= 2
    print("値は、\\(num7_4)です")
    cnt7_4 += 1
}

//repeat:後判定
var num7_5 = 3
var cnt7_5 = 1
repeat {
    print("前判定スタート")
    num7_5 *= 2
    print("値は、\\(num7_5)です")
    cnt7_5 += 1
} while cnt7_5 < -1

//while文:前判定
var num7_6 = 3
var cnt7_6 = 1
while cnt7_6 < -1 {
    print("後判定スタート")
    num7_6 *= 2
    print("値は、\\(num7_6)です")
    cnt7_6 += 1
}

//breakとcontinue
//省略しないを流用
var sum7_7 = 0
for cnt7_7 in 1...100 {
    sum7_7 += 1
    if cnt7_7 > 50 && cnt7_7 <= 80 {
        print("回数は\\(cnt7_7)で、合計は、\\(sum7_7)です")
    } else if cnt7_7 > 80{
        break
    } else if sum7_7 == 30 {
        sum7_7 *= 2
        print("回数は\\(cnt7_7)で、合計は、\\(sum7_7)です")
        continue
    } else {
        print("合計は、\\(sum7_7)です")
    }
}

//guard文
func sumOver10000(summary7_8: Double?){
    var price7_8 = summary7_8
    var resultValue7_8 = price7_8! * 1.10
    guard resultValue7_8 < 5500 else {
        print("num7_8は5500円以上です")
        return
    }
    print(resultValue7_8)
}

let lowestPrice7_8 = 100
let highestPrice7_8 = 5200
for rank7_8 in lowestPrice7_8...highestPrice7_8 {
    sumOver10000(summary7_8: Double(rank7_8))
}
"""
let codeEssentials8 = """
/**:-------------------------------------------
  Essentials 第8章
 ----------------------------------------------*/
//シンプルな例-10000を超えたら、文を切り替え
var num8_1 = 10
for cnt8_1 in 1...5 {
    num8_1 *= 10
    switch num8_1 {
    case 10000:
        print("10000になりました")
    case 100000:
        print("100000になりました")
//    case 1000000:
//        print("1000000になりました")
    default:
        print("現在の値は、\\(num8_1)です")
    }
}
//曜日判定-ゴミ出し日
var Weekday8_2 = 0
var dayName8_2:String? = ""
for cnt8_2 in 1...7 {
    Weekday8_2 += 1
    switch Weekday8_2 {
    case 1:
        dayName8_2 = "月曜日"
        print("今日は\\(dayName8_2!)なので、ゴミ出し日です。")
    case 5:
        dayName8_2 = "金曜日"
        print("今日は\\(dayName8_2!)なので、ゴミ出し日です。")
    default:
        dayName8_2 = "月金以外"
        print("\\(dayName8_2!)なので、ゴミ出し日ではなりません")
    }
}

//成績判定-80:優 70-79:良 60-69:可 59以下:不合格
var resultPoint8_3 = 0
var testResult8_3:String? = ""
var resultPass8_3:String? = ""
for cnt8_3 in 1...11 {
    switch resultPoint8_3 {
    case 80...100:
        testResult8_3 = "優"
        resultPass8_3 = "合格"
        print("\\(resultPoint8_3)点なので、\\(testResult8_3!)で\\(resultPass8_3!)です。")
    case 70...79:
        testResult8_3 = "良"
        resultPass8_3 = "合格"
        print("\\(resultPoint8_3)点なので、\\(testResult8_3!)で\\(resultPass8_3!)です。")
    case 60...69:
        testResult8_3 = "良"
        resultPass8_3 = "合格"
        print("\\(resultPoint8_3)点なので、\\(testResult8_3!)で\\(resultPass8_3!)です。")
    default:
        resultPass8_3 = "不合格"
        print("\\(resultPoint8_3)点なので、\\(resultPass8_3!)です。")
    }
    resultPoint8_3 += 10
}

//成績判定-60以上は合格。合格の場合のみ値が奇数か偶数か判定
var resultPoint8_4 = 0
var testResult8_4:String? = ""
var resultPass8_4:String? = ""
for cnt8_3 in 1...20 {
    switch resultPoint8_4 {
    case 60...100 where resultPoint8_4 % 2 == 0:
        resultPass8_4 = "合格"
        print("\\(resultPoint8_4)点なので、\\(resultPass8_4!)です。得点は偶数")
    case 60...100 where resultPoint8_4 % 2 != 0:
        resultPass8_4 = "合格"
        print("\\(resultPoint8_4)点なので、\\(resultPass8_4!)です。得点は奇数")
    default:
        resultPass8_4 = "不合格"
        print("\\(resultPoint8_4)点なので、\\(resultPass8_4!)です。")
    }
    resultPoint8_4 += 5 //5点ずつ加算
}

//加算判定:61にならボーナスポイント100を足す
var resultPoint8_5 = 61
var bonusPoint8_5 = 0
switch resultPoint8_5 {
case 61:
    bonusPoint8_5 += 100
    print("\\(resultPoint8_5)点です。ボーナスポイントは\\(bonusPoint8_5)")
    fallthrough
default:
    bonusPoint8_5 += 1
    print("\\(resultPoint8_5)点です。ボーナスポイントは\\(bonusPoint8_5)")
}
"""
let codeEssentials9_1 = """
/**:---------------------------------------------------------
  Essentials 第9章 関数
 -----------------------------------------------------------*/
//基本
//オイラの名前関数を宣言
func myName9_1(){
    print("M_Kaku堂")
}
//関数を呼び出して実行
myName9_1()

//名前と年齢関数
func myNameAndAge9_2(myName:String,myAge:Int) ->String{
    return("オイラの名前は、\\(myName)で歳は、\\(myAge)歳")
}
print(myNameAndAge9_2(myName: "M_Kaku堂", myAge: 43))

//名前と年齢関数の名前を小文字に〜〜
func myNameAndAge9_3(myName:String,myAge:Int) ->String{
    let lowerName9_3 = myName.lowercased()
    return("オイラの名前は、\\(lowerName9_3)で歳は、\\(myAge)歳")
}
print(myNameAndAge9_3(myName: "M_Kaku堂", myAge: 43))

//変数の値として呼び出し〜〜〜
func myNameAndAge9_4(myName:String,myAge:Int) ->String{
    let lowerName9_4 = myName.lowercased()
    return("オイラの名前は、\\(lowerName9_4)で歳は、\\(myAge)歳")
}
//変数名にセット
var oilaNameAge9_4 = myNameAndAge9_4(myName: "M_Kaku堂", myAge: 43)
print("oilaNameAge9_4:\\(oilaNameAge9_4)")
oilaNameAge9_4 = "岸田さんてんてこまい"
print(oilaNameAge9_4)

//パラメータ名を省略〜〜〜
func myNameAndAge9_5(_ myName:String,_ myAge:Int) ->String{
    var lowerName = myName.lowercased()
    return("オイラの名前は、\\(lowerName)で歳は、\\(myAge)歳")
}
//変数名にセット
var oilaNameAge9_5 = myNameAndAge9_5("M_Kaku堂", 43)
print("oilaNameAge9_5:\\(oilaNameAge9_5)")
oilaNameAge9_5 = "松野さん寿司ざんまい"
print(oilaNameAge9_5)

//キーワード〜〜〜
func myNameAndAge9_6(oilaName myName:String,oilaAge myAge:Int) ->String{
    var lowerName = myName.lowercased()
    return("オイラの名前は、\\(lowerName)で歳は、\\(myAge)歳")
}
//変数名にセット
var oilaNameAge9_6 = myNameAndAge9_6(oilaName: "M_Kaku堂", oilaAge: 43)
print("oilaNameAge9_6:\\(oilaNameAge9_6)")
oilaNameAge9_6 = "誰かさん達、きりきりまい"
print(oilaNameAge9_6)

//初期値を設定
func myNameAndAge9_7(oilaName myName:String = "M_Kaku堂",oilaAge myAge:Int = 43) ->String{
    var lowerName = myName.lowercased()
    return("オイラの名前は、\\(lowerName)で歳は、\\(myAge)歳")
}
//変数名にセット
var oilaNameAge9_7 = myNameAndAge9_7()
print("oilaNameAge9_7:\\(oilaNameAge9_7)")
oilaNameAge9_7 = "とある事情で1月末まで、長い年末年始休暇"
print(oilaNameAge9_7)

//関数の一部だけ操作
func myNameAndAge9_8(_ myName:String = "M_Kaku堂",myAge:Int = 43) ->String{
    return("オイラの名前は、\\(myName)で歳は、\\(myAge)歳")
}
//変数名にセット
var oilaAge9_8 = myNameAndAge9_8(myAge:27)
print("oilaAge9_8:\\(oilaAge9_8)")

/**
 //型を省略=型推論→エラー
 func myNameAndAge9_9(myName = "M_Kaku堂",myAge = 43) ->String{
     return("オイラの名前は、\\(myName)で歳は、\\(myAge)歳")
 }
 //変数名にセット
 var oilaAge9_9 = myNameAndAge9_9(myAge:27)
 print("oilaAge9_9:\\(oilaAge9_9)")
 */

//複合計算
func timeMesure9_10(_ milliSeconds: Double) -> (seconds: Double,minutes: Double,hours: Double, days: Double){
    let seconds = milliSeconds * 1000
    let minutes = seconds * 60
    let hours = seconds * 60 * 60
    let days = seconds * 60 * 60 * 24
    
    return(seconds,minutes,hours,days)
}
for cnt9_10 in 1...10 {
    var time9_10 = timeMesure9_10(Double(cnt9_10))
    print("\\(cnt9_10)秒は、\\(time9_10.seconds)ms")
    print("\\(cnt9_10)分は、\\(time9_10.minutes)ms")
    print("\\(cnt9_10)時間は、\\(time9_10.hours)ms")
    print("\\(cnt9_10)日は、\\(time9_10.days)ms")
}

//可変パラメータ
func callPhoneNumber9_11(_ phoneNumbers:String...)
{
    for phoneNumber in phoneNumbers {
        print("登録電話番号は、上から順に、\\(phoneNumber)です。")
    }
}

callPhoneNumber9_11(
    "03-XXXX-XXX1",
    "03-XXXX-XXX2",
    "03-XXXX-XXX3",
    "03-XXXX-XXX4"
)

//面積計算
func calcSquareCM9_12(vertical:Double, horizontal:Double) -> Double{
    var vertical = vertical
    var horizontal = horizontal
    let meter: Double = 100
    vertical = vertical * meter
    horizontal = horizontal * meter
 
    return vertical * horizontal
}

for cnt9_12 in 1...10 {
    print("縦が\\(cnt9_12)メートルの面積は、\\(calcSquareCM9_12(vertical: Double(cnt9_12), horizontal: Double(cnt9_12 * 3)))センチメートル")
}

//入出力
func multipleNumber9_13(_ number: inout Int) -> Int{
//    var number = number
    number *= number
    return(number)
}
var myNumber9_13 = 123
print("関数実行前:\\(myNumber9_13)")
print("関数実行:\\(multipleNumber9_13( &myNumber9_13))")
print("関数実行後:\\(myNumber9_13)")

//パラメータとして関数を使う
//メートルをセンチメートルに変換
func meterToCm9_14(length: Double) -> Double{
    return length * 100
}
//メートルをキロメートルに変換
func meterToKm9_14(length: Double) -> Double{
    return length / 1000
}
//メートルをセンチメートルに変換メッセージ
func outputChangedCm(_ changeFunc: (Double) -> Double, value: Double){
    let changeResult = changeFunc(value)
    print("変更結果は、\\(changeResult)センチです")
}
//メートルをキロメートルに変換メッセージ
func outputChangedKm(_ changeFunc: (Double) -> Double, value: Double){
    let changeResult = changeFunc(value)
    print("変更結果は、\\(changeResult)キロメートルです")
}
//関数をパラメータとして定義
let cmLength = meterToCm9_14
let kmLength = meterToKm9_14
//値を指定例①
outputChangedCm(cmLength, value: 10)
outputChangedKm(kmLength, value: 20)
//値を指定例②
for cnt9_14 in 1 ... 1000 {
    var meterValue = Double(cnt9_14)
    outputChangedCm(cmLength, value: meterValue)
    outputChangedKm(kmLength, value: meterValue)
}
"""
let codeEssentials9_2 = """
/**:---------------------------------------------------------
  Essentials 第9章 クロージャ
 -----------------------------------------------------------*/
//じっくり21で追加
import EventKit

let division9_15 = {(_ num1_9_15:Int,_ num2_9_15:Int)-> Int in
    return num1_9_15 / num2_9_15
}
let divideResult9_15 = division9_15(20,3)
/*ここのコードはコケちゃうからコメントアウト
//クロージャの使用例1
let eventstore9_16: EKEventStore = EKEventStore()

eventstore9_16.requestFullAccessToEvents(completion: {(granted:Bool, error: Error?) -> Void in
    if !granted {
        print(error!.localizedDescription)
    }
})

//クロージャの使用例2
let eventstore9_17: EKEventStore = EKEventStore()

eventstore9_17.requestWriteOnlyAccessToEvents(completion: {(granted:Bool, error: Error?) -> Void in
    if !granted {
        print(error!.localizedDescription)
    }
})
 */
//キーワード
let combination9_18 = {(str1_9_18: String, str2_9_18:String) -> String in
    str1_9_18 + str2_9_18
}

//省略
let combination9_19: (String,String) -> String = {
    $0 + $1
}
combination9_19("aiu","eo")

var comp9_20 = 10
print(comp9_20)
func calc9_20() -> () -> Int {
    func calc9_21() -> Int {
        return comp9_20 * 10
    }
    return calc9_21
}

let closureSelf = calc9_20()
let resultClosure = closureSelf
print(resultClosure)
"""
let codeEssentials10 = """
/**:-------------------
 Essentials 第10章 Swiftオブジェクト志向プログラミング
 ---------------------*/
class ProfileAccount10_1 {
    //ストアドプロパティ
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9//キログラム
    var m_KakuHeight: Float = 1.7//メートル
    var himanFlg: Bool = false
    var notFatFlg: Bool = true
    //コンピューテッドプロパティ:BMI計算
    var calcBMI: Float {
        get {
            return m_KakuWeight / (m_KakuHeight * m_KakuHeight)
        }
        set(resultBMI) {
            if resultBMI > 25 {
                himanFlg = true
            } else {
                himanFlg = false
            }
        }
    }
    //コンピューテッドプロパティ:肥満未満の体重上限
    var nonFatMyWeight: Float {
        get {
            return 25 * (m_KakuHeight * m_KakuHeight)
        }
        set(weightFatResult) {
            if weightFatResult - m_KakuWeight > 0 {
                notFatFlg = true
            } else {
                himanFlg = false
            }
        }
    }
    //イニシャライザ
    init(m_KakuAge: Int, m_KakuWeight: Float) {
        self.m_KakuAge = m_KakuAge
        self.m_KakuWeight = m_KakuWeight
    }
    //デイニシャライザ
    deinit{
        print("deinit")
    }
    //タイプメソッド
    func msgMyProfile(){
        print("オイラは\\(m_KakuAge)のおっさんだぞ")
        print("オイラの体重は\\(m_KakuWeight)だよ。運動せんと、、、💦")
    }
    //インスタンスメソッド
    class func getMinimunWeight() -> Float {
        return 49.9
    }
}
var myProfile: ProfileAccount10_1 = ProfileAccount10_1(m_KakuAge: 42, m_KakuWeight: 59.0)
//初期化したインスタンスからプロパティ呼び出し
var myAge = myProfile.m_KakuAge
print(myAge)
//違う年齢を代入して
myProfile.m_KakuAge = 52
//タイプメソッド呼び出し
myProfile.msgMyProfile()
//インスタンスメソッド呼び出し〜〜
var minWeight = ProfileAccount10_1.getMinimunWeight()
//自分の体重を48.9に代入
var myWeight = myProfile.m_KakuWeight
myWeight = 48.9
//比較して〜〜
if myWeight > minWeight {
    print("良い感じ")
} else {
    print("痩せ過ぎじゃない?")
}
//BMI計算結果を呼び出す
var myBMI = myProfile.calcBMI
print(myBMI)
//肥満かどうかの判定
var myFat = myProfile.himanFlg
if myFat == false {
    print("肥満じゃないです")
} else {
    print("肥満に注意")
}
//肥満未満になる体重上限値を取得
var myNotFatMax = myProfile.nonFatMyWeight
print(myNotFatMax)
var notFatFlg = myProfile.notFatFlg
if notFatFlg == true {
    print("まだ太れます")
} else {
    print("運動しましょう")
}

//Lazy以降
var myAge10_2 = 43
//普通のクラスだと、
class MyAge10_2{
    var myTitle: String
    init(myTitle: String) {
        self.myTitle = myTitle
    }
}
//ファイルの属性を遅延評価によって取得
class FileAttribute10_3{
    let fileName: String
    //遅延評価で値を決定
    lazy var size: Int = self.getFileSize()
    init(file: String) {
        fileName = file
    }
    func getFileSize() -> Int{
        //構造体の初期化
        var buffer = stat()
        //stat呼び出し
        stat(fileName, &buffer)
        //動作確認のための印字
        print("[getFileSize]")
        //得られた値をInt型に変換
        return Int(buffer.st_size)
    }
}
//実行
let d10_3 = FileAttribute10_3(file: "text.txt")
print(d10_3.fileName)
print(d10_3.size)
print(d10_3.size)

//ファイルの属性を遅延評価によって取得クロージャ版
class FileAttribute10_4{
    let fileName: String
    //クロージャ版
    lazy var size: Int = {
        var buffer = stat()
        stat(self.fileName, &buffer)
        print("[getFileSize]")
        return Int(buffer.st_size)
    }() //ここの()は必須
    init(file: String){
        fileName = file
    }
}
//実行
let d10_4 = FileAttribute10_4(file: "text.txt")
print(d10_4.fileName)
print(d10_4.size)
print(d10_4.size)

class MyCalc10_5{
    var myNum = 10
    func minus1() {
        self.myNum -= 1
    }
}

class MyCalc10_6 {
    var myNum = 10
    func minus1(myNum: Int) {
        print(myNum)
        print(self.myNum)
    }
}

protocol M_KakuProfile10_7{
    var name: String{ get }
    func msgBuild() -> String
}

class MKakuProfile10_7: M_KakuProfile10_7{
    var name: String
    init(name: String) {
        self.name = name
    }
    func msgBuild() -> String {
        "オイラの名前は、" + name
    }
    //不透明な戻り値 Opaque return type
    //Equatableプロトコルを使うみたいだね
    func tripleCalc(value: Int,str: String) -> some Equatable{
        value * 3
        return str + "様"
    }
}
//以下は不透明な戻り値の比較例エラーになるからコメントアウト
/*
func doubleFunc1(value: Int) -> some Equatable {
    value * 2
}
func doubleFunc2(value: String) -> some Equatable {
    value + value
}
let intOne = doubleFunc1(value: 10)
let stringOne = doubleFunc2(value: "Hello")
if (intOne == stringOne) {
    print("They match")
}
 */
"""
let codeEssentials11 = """
/**:-------------------
 Essentials 第11章 サブクラスと拡張の説明
 ---------------------*/
class ProfileAccount10_1 {
    //ストアドプロパティ
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9//キログラム
    var m_KakuHeight: Float = 1.7//メートル
    var himanFlg: Bool = false
    var notFatFlg: Bool = true
    //コンピューテッドプロパティ:BMI計算
    var calcBMI: Float {
        get {
            return m_KakuWeight / (m_KakuHeight * m_KakuHeight)
        }
        set(resultBMI) {
            if resultBMI > 25 {
                himanFlg = true
            } else {
                himanFlg = false
            }
        }
    }
    //コンピューテッドプロパティ:肥満未満の体重上限
    var nonFatMyWeight: Float {
        get {
            return 25 * (m_KakuHeight * m_KakuHeight)
        }
        set(weightFatResult) {
            if weightFatResult - m_KakuWeight > 0 {
                notFatFlg = true
            } else {
                himanFlg = false
            }
        }
    }
    //イニシャライザ
    init(m_KakuAge: Int, m_KakuWeight: Float) {
        self.m_KakuAge = m_KakuAge
        self.m_KakuWeight = m_KakuWeight
    }
    //デイニシャライザ
    deinit{
        print("deinit")
    }
    //タイプメソッド
    func msgMyProfile(){
        print("オイラは\\(m_KakuAge)のおっさんだぞ")
        print("オイラの体重は\\(m_KakuWeight)だよ。運動せんと、、、💦")
    }
    //インスタンスメソッド
    class func getMinimunWeight() -> Float {
        return 49.9
    }
}
class M_Kaku_Private11_1: ProfileAccount10_1{
    //足のサイズ(センチメートル)
    var myFootSize: Float = 27.0
    //イニシャライザ
    init(age:Int, weight: Float, foot:Float) {
        myFootSize = foot
        super.init(m_KakuAge: 43, m_KakuWeight: 59.1)
    }
    //意味はないけど、足のサイズに身長をかけてみた
    func calc() -> Float {
        return myFootSize * m_KakuHeight
    }
    //オーバーライド
    override func msgMyProfile(){
        //        print("オイラは\\(m_KakuAge)のおっさんだぞ")
        //        print("オイラの体重は\\(m_KakuWeight)だよ。運動せんと、、、💦")
        //スーパーさんを使う
        super.msgMyProfile()
        //ここに親クラスのメソッドを流用して追加
        print("足のサイズ(cm)は、\\(myFootSize)だよ。")
    }
}
var myFoot11_1: M_Kaku_Private11_1 = M_Kaku_Private11_1(age: 43, weight: 59.1, foot: 27.0)
print("足のサイズ(cm)x 身長(m)は、\\(myFoot11_1.calc())")
myFoot11_1.msgMyProfile()

//拡張
extension Float{
    var circleAround: Float{
        return self * 3.14159265359
    }
    var circleArea: Float{
        return self * self * 3.14159265359
    }
}
//実行
let myCircle11_2: Float = 2
print(myCircle11_2)
print(myCircle11_2.circleAround)
print(myCircle11_2.circleArea)
"""
let codeEssentials12 = """
/**:-------------------
 Essentials 第12章 構造体と列挙型
 ---------------------*/
struct M_KakuSampleStruct12_1{
    var name: String
    init(name: String) {
        self.name = name
    }
    func msgM_KakuName(){
        "オイラは、" + name + "だぞ!"
    }
}
class M_KakuSampleClass12_2{
    var name: String
    init(name: String) {
        self.name = name
    }
    func msgM_KakuName(){
        "オイラは、" + name + "だぞ!"
    }
}
let m_KakuStruct12_1 = M_KakuSampleStruct12_1(name: "M_Kaku堂")
print(m_KakuStruct12_1.name)
let m_KakuClass12_2 = M_KakuSampleClass12_2(name: "M_Kaku堂")
print(m_KakuClass12_2.name)

var m_KakuStruct12_3 = m_KakuStruct12_1
//構造体のインスタンスに代入
m_KakuStruct12_3.name = "D_Kaku堂"
print(m_KakuStruct12_1.name)
print(m_KakuStruct12_3.name)
var m_KakuClass12_3 = m_KakuClass12_2
//クラスのインスタンスに代入
m_KakuClass12_3.name = "D_Kaku堂"
print(m_KakuClass12_2.name)
print(m_KakuClass12_3.name)

enum M_KakuBody12_5{
    case slim
    case medium
    case fat
}
func msgM_KakuBody12_5(body:M_KakuBody12_5){
    switch body {
    case.slim:
        print("痩せてる")
    case.medium:
        print("中肉中背")
    case.fat:
        print("肥満")
    }
}
msgM_KakuBody12_5(body: M_KakuBody12_5.medium)

enum M_KakuBody12_6{
    case slim
    case medium
    case fat
    case danger(dangerWeight:Double)
}
func msgM_KakuBody12_6(body:M_KakuBody12_6){
    switch body {
    case.slim:
        print("痩せてる")
    case.medium:
        print("中肉中背")
    case.fat:
        print("肥満")
    case.danger(let dangerWeight) where dangerWeight >= 72.2:
        print("危険な体重\\(dangerWeight)を超えた肥満です。ダイエットしましょう!")
    default:
        break
    }
}
msgM_KakuBody12_6(body: M_KakuBody12_6.danger(dangerWeight: 73.1))
"""
let codeEssentials13 = """
/**:-------------------
 Essentials 第13章 プロパティラッパー
 ---------------------*/
struct M_KakuAddress13_1 {
    private var prefectureName: String = ""
    var myPrefecture: String {
        get { prefectureName}
        set { prefectureName = newValue.uppercased()}
    }
}
//実行
var m_KakuAddress13_1 = M_KakuAddress13_1()
m_KakuAddress13_1.myPrefecture = "Fukuoka"
print(m_KakuAddress13_1.myPrefecture)

//プロパティラッパーで受け渡し〜〜〜
@propertyWrapper
struct FixM_KakuAddress13_2 {
    private(set) var prefecture: String = ""
    
    var wrappedValue: String {
        get {prefecture}
        set {prefecture = newValue.uppercased()}
    }
    init(wrappedValue initialValue: String) {
        self.wrappedValue = initialValue
    }
}
struct AccessAddress13_3 {
    @FixM_KakuAddress13_2 var city: String
    @FixM_KakuAddress13_2 var area: String
    @FixM_KakuAddress13_2 var country: String
}
//実行
var accessAddress = AccessAddress13_3(city: "Fukuokacity", area: "dokoka", country: "Japan")
print(accessAddress.city,accessAddress.area ,accessAddress.country )
//複数の値を定義
@propertyWrapper
struct MinMaxWeight13_5 {
    var valueWeight: Int
    let maxWeight: Int
    let minWeight: Int
    init(wrappedValue: Int, minWeight: Int, maxWeight: Int) {
        valueWeight = wrappedValue
        self.minWeight = minWeight
        self.maxWeight = maxWeight
    }
    
    var wrappedValue: Int {
        get { return valueWeight }
        set {
            if newValue > maxWeight {
                valueWeight = maxWeight
            } else if newValue < minWeight {
                valueWeight = minWeight
            } else {
                valueWeight = newValue
            }
        }
    }
}

struct M_KakuWeight13_4 {
    @MinMaxWeight13_5(minWeight: 59, maxWeight: 72) var valueWeight: Int = 80
}
//実行
var m_KakuWeight13_6 = M_KakuWeight13_4()
m_KakuWeight13_6.valueWeight = 80
print(m_KakuWeight13_6.valueWeight)
m_KakuWeight13_6.valueWeight = 58
print(m_KakuWeight13_6.valueWeight)

//Comparableプロトコル
@propertyWrapper
struct MinMaxWeight13_7<V:Comparable> {
    var valueWeight: V
    let maxWeight: V
    let minWeight: V
    init(wrappedValue: V, minWeight: V, maxWeight: V) {
        valueWeight = wrappedValue
        self.minWeight = minWeight
        self.maxWeight = maxWeight
    }
    
    var wrappedValue: V {
        get { return valueWeight }
        set {
            if newValue > maxWeight {
                valueWeight = maxWeight
            } else if newValue < minWeight {
                valueWeight = minWeight
            } else {
                valueWeight = newValue
            }
        }
    }
}

struct M_KakuWeight13_8 {
    @MinMaxWeight13_7(minWeight: "痩せすぎ", maxWeight: "太り過ぎ") var valueWeight:String = "ちょい肥満"
}
//実行
var m_KakuWeight13_9 = M_KakuWeight13_8()
m_KakuWeight13_9.valueWeight = "肥満以上"
print(m_KakuWeight13_9.valueWeight)
m_KakuWeight13_9.valueWeight = "痩せすぎ以下"
print(m_KakuWeight13_9.valueWeight)

//日付を使ってプロパティラッパーで遊ぶ
@propertyWrapper
struct CompareDate13_10<V: Comparable> {
  var valueDate: V
  let maxDate: V
  let minDate: V
    
    init(wrappedValue: V, minDate: V, maxDate: V) {
    valueDate = wrappedValue
    self.minDate = minDate
    self.maxDate = maxDate
  }
 
  var wrappedValue: V {
    get { return valueDate }
    set {
       if newValue > maxDate {
        valueDate = maxDate
       } else if newValue < minDate {
        valueDate = minDate
       } else {
        valueDate = newValue
      }
    }
  }
}
struct DateCompare13_11 {
     @CompareDate13_10(minDate: Date(), maxDate: Calendar.current.date(byAdding: .month,
           value: 1, to: Date())! ) var valueDate: Date = Date()
}
var dateComparing13_12 = DateCompare13_11()
print(dateComparing13_12.valueDate)
//10日後
dateComparing13_12.valueDate = Calendar.current.date(byAdding: .day, value: 10, to: Date())!
print(dateComparing13_12.valueDate)
//1ヶ月後
dateComparing13_12.valueDate = Calendar.current.date(byAdding: .month, value: 2, to: Date())!
print(dateComparing13_12.valueDate)
"""
let codeEssentials14_1 = """
/**:-------------------
 Essentials 第14章 配列
 ---------------------*/
//型指定なし
var fruitsBaskets14_1 = ["🍏","🍌","🍇","🍓"]
//型指定あり
var fruitsBaskets14_2:[String] = ["🍈","🍍","🍋","🍉"]
//インスタンス
var fruitsBaskets14_3 = [String]()
var fruitsPrices14_4 = [Float]()
//インスタンスに初期値を設定
var fruitsBaskets14_5 = [String](repeating: "りんご", count: 3)
//実行
print(fruitsBaskets14_5.count)
//配列を結合
var fruitBaskets14_6 = fruitsBaskets14_1 + fruitsBaskets14_2
//実行
print(fruitBaskets14_6.self)
//条件分岐
if fruitsBaskets14_3.isEmpty {
    print("値が何もないぞ👀")
} else {
    print("値があるぞ👀")
}
//りんごにアクセス
print(fruitsBaskets14_1[0])
//バナナにアクセス
print(fruitsBaskets14_1[1])
//シャッフル
let shuffledFruitsBaskets14_7 = fruitBaskets14_6.shuffled()
print(shuffledFruitsBaskets14_7.self)
//ランダム
let randomFruitsBaskets14_8 = shuffledFruitsBaskets14_7.randomElement()
print(randomFruitsBaskets14_8!.self)//強制アンラップして〜〜
//要素に桃を追加
fruitsBaskets14_2 += ["🍑"]
//実行
print(fruitsBaskets14_2.self)
//結合のやつをまんま実行
print(fruitBaskets14_6.self)
//結合し直してあげる
var combinedFruits14_9 = fruitsBaskets14_1 + fruitsBaskets14_2
print(combinedFruits14_9.self)
//りんごとバナナの間にもう一個🍑入れてみよう
combinedFruits14_9.insert("🍑", at: 1)
print(combinedFruits14_9)
//最後の🍑を削除
combinedFruits14_9.removeLast()
print(combinedFruits14_9)
//さっきの🍑も削除
combinedFruits14_9.remove(at: 1)
print(combinedFruits14_9)
//反復
for fruits in combinedFruits14_9 {
    print(fruits)
}
//いったん全要素を削除
combinedFruits14_9.removeAll()
print(combinedFruits14_9)
//8個の要素を追加
for n in 0...8 {
    combinedFruits14_9.insert("🍑", at: 0)
}
print(combinedFruits14_9.self)
//いったん全要素を削除
combinedFruits14_9.removeAll()
//元に戻す
combinedFruits14_9 = fruitsBaskets14_1 + fruitsBaskets14_2
print(combinedFruits14_9)
//キーワードを使って
combinedFruits14_9.forEach{
    print($0)
}
//八百屋
var yaoya14_10:[Any] = ["🍏",123]
var yaoya14_11:[Any] = ["🍏",123,"🍌",200]
var yaoya14_12:[Any] = ["🍏","🍌",123,200]
//繰り返しで出力
yaoya14_12.forEach{
    print($0)
}
for item in yaoya14_12 {
    print(item)
}
//キャスト〜〜〜
//for item in yaoya14_12 {
//    print(item as!Int * 100)
//}
"""
let codeEssentials14_2 = """
/**:-------------------
 Essentials 第14章 辞書
 ---------------------*/
var yaoya14_13:[Int: String] = [1:"🍏",2:"🍌",3:"🍇",4:"🍓",5:"🍈",6:"🍍",7:"🍋",8:"🍉"]
print(yaoya14_13[2]!)
//キーと値を分けた配列を結合
var yaoyaKeys14_14 = [1,2,3,4,5,6,7,8]
var yaoyaValues14_14 =
["🍏","🍌","🍇","🍓","🍈","🍍","🍋","🍉"]
var yaoya14_14 = Dictionary(uniqueKeysWithValues: zip(yaoyaKeys14_14, yaoyaValues14_14))
print(yaoya14_14)
print(yaoya14_14.sorted(by: <))
//1から順に番号を振るだけ
var yaoya14_15 = Dictionary(uniqueKeysWithValues: zip(1..., yaoyaValues14_14))
print(yaoya14_15)
var sortedYaoya14_16 = yaoya14_15.sorted{$0.key < $1.key }
print(sortedYaoya14_16)
for element in sortedYaoya14_16 {
    print("\\(element.key):\\(element.value)")
}
//個数
print("項目数は、\\(sortedYaoya14_16.count)だぜ!")
//キーが3の値を呼び出し
print(yaoya14_13[3]!)
//存在しないキーにアクセスしてみると、、、
print(yaoya14_13[9,default:"木梨(キーなし)さん"])
//🍑ちゃんを逆に9キーを作って追加してみる
yaoya14_13[9] = "🍑"
print(yaoya14_13[9,default:"木梨(キーなし)さん"])
print(yaoya14_13)
//🍑から🍐へ
yaoya14_13.updateValue("🍐", forKey: 9)
print(yaoya14_13[9,default:"木梨(キーなし)さん"])
print(yaoya14_13)
//🍐を値のみ削除
yaoya14_13[9] = ""
print(yaoya14_13[9,default:"木梨(キーなし)さん"])
print(yaoya14_13)
//値が空欄判定を行い、空欄の場合はキーごと削除
if yaoya14_13[9] == "" {
    yaoya14_13[9] = nil
    print(yaoya14_13[9,default:"木梨(キーなし)さん"])
    print(yaoya14_13)
}
//7キーを削除
yaoya14_13.removeValue(forKey: 7)
print(yaoya14_13)
//キーと値を使って商品番号と商品名を表示
for (key,value) in yaoya14_13 {
    print("商品番号\\(key)は、\\(value)です")
}
//ソートしたヤツで試すと、、、
for (key,value) in sortedYaoya14_16 {
    print("商品番号\\(key)は、\\(value)です")
}
"""
let codeEssentials15 = """
/**:-------------------
 Essentials 第15章 エラーハンドリング
 ---------------------*/
//変数を宣言
var warning15_3 = false
var wrong15_3 = false
var fatal15_3 = true
var errorWarningMsg15_3 = "Warn"
var errorWrongMsg15_3 = "Wrong"
var errorFatalMsg15_3 = "Fatal"
//エラーコード
var errorCode15_6 = 3

//エラーを宣言
enum ErrorTypes15_1: Error{
    case warning
    case wrong
    case fatal
}
//エラー処理関数
func errorHandling15_2() throws {
    guard warning15_3 == true else {
        throw ErrorTypes15_1.warning
    }
    guard wrong15_3 == true else {
        throw ErrorTypes15_1.wrong
    }
    guard fatal15_3 == true else {
        throw ErrorTypes15_1.fatal
    }
}
//try-catch文
//3つとも場合分け
func returnErrorHandling15_4() -> String{
    do {
        try errorHandling15_2()
    } catch ErrorTypes15_1.warning {
        return("Error is warning")
    } catch ErrorTypes15_1.wrong{
        return("Error is wrong")
    } catch ErrorTypes15_1.fatal {
        return("Error is fatal")
    } catch {
        return("Error is unknown")
    }
    return("Error is nothing")
}
//fatalかどうかで場合分け
func returnErrorHandling15_5() -> String{
    do {
        try errorHandling15_2()
    } catch ErrorTypes15_1.warning, ErrorTypes15_1.wrong {
        return("Error is not fatal")
    } catch ErrorTypes15_1.fatal {
        return("Error is fatal")
    } catch {
        return("Error is unknown")
    }
    return("Error is nothing")
}
//3つとも場合分け
func returnErrorHandling15_6() -> String{
    defer{
        //初期値の3に戻す
        errorCode15_6 = 3
    }
    do {
        try errorHandling15_2()
    } catch ErrorTypes15_1.warning {
        errorCode15_6 += 100
        print("Error is warning,ErrorCode: \\(errorCode15_6)")
        return("Error is warning")
    } catch ErrorTypes15_1.wrong{
        errorCode15_6 += 2000
        print("Error is wrong,ErrorCode: \\(errorCode15_6)")
        return("Error is wrong")
    } catch ErrorTypes15_1.fatal {
        errorCode15_6 += 10000
        print("Error is fatal,ErrorCode: \\(errorCode15_6)")
        return("Error is fatal")
    } catch {
        print("Error is unknown")
        return("Error is unknown")
    }
    print("Error is nothing")
    return("Error is nothing")
}
//実行
returnErrorHandling15_6()
//3つとも場合分け:エラーコードのみ
func returnErrorHandling15_7() -> String{
    defer{
        errorCode15_6 = 3
    }
    do {
        try errorHandling15_2()
    } catch ErrorTypes15_1.warning {
        errorCode15_6 += 100
        print("ErrorCode: \\(errorCode15_6)")
        return("Error is warning")
    } catch ErrorTypes15_1.wrong{
        errorCode15_6 += 2000
        print("ErrorCode: \\(errorCode15_6)")
        return("Error is wrong")
    } catch ErrorTypes15_1.fatal {
        errorCode15_6 += 10000
        print("ErrorCode: \\(errorCode15_6)")
        return("Error is fatal")
    } catch {
        print("Error is unknown")
        return("Error is unknown")
    }
    print("Error is nothing")
    return("Error is nothing")
}
//実行
returnErrorHandling15_7()
for n in 1...100{
    returnErrorHandling15_7()
}
"""

//ポイント
let pointEssentials1 = """
・コントロールフロー
・機能(関数って意味かな💦)
・オブジェクト指向(正確にはオブジェクト志向性)プログラミング
・プロパティラッパー
・構造
・エラーハンドリング
・スタック
・フレーム
・フォーム
・ObservableObject
・State
・EmvironmentObject
・モディファイア
・リスト
・タブ
・コンテキストメニュー
・ナビゲーション
・アウトライングループ
・グラフィクス
・チャート図
・アニメーション
・トランジション
・ジャスチャーハンドリング
・ウィジェットキット
・ライブアクティビティ
・ドキュメントアプリ
・コアデータ
・Swiftデータ
・クラウドキット
・SwiftUIでの統合
・UIKitベースでの統合
・UIKitをSwiftUIに統合する方法
・AppStoreにパッケージを公開する方法

🧐Swiftプログラマなら、最新の学び直しに
🤔非Swiftプログラマなら学びの最初に
👉どんな人でも対象だよ🕺
ソースのダウンロード
何か不備とかエラーがあったらフィードバックとかエラー報告
"""

let pointEssentials2 = """
AppleDeveloperProgramについて説明
フリーから年間99ドルのAppleDeveloper ProgramMembership(以下、メンバーシップ)まである
フリーで利用すると、開発時に使えるサービスに結構、制約がある
(例)
・Siriとの統合
・iCloudへのアクセス
・Apple Pay
・Game Center
・アプリの販売
⭐️セルフエスティーム型の自己肯定感とかメリトクラシー感が強い自称、プロエンジニアさんとかだと、そんなことは、知っていて当たり前とかでバッサリ切り捨てそうなんだけど、知らなかった人、安心してください。
誰でも最初は知らないんだし、何より、
「自分の知ってることは、説明とかしなくても知っていて当たり前=勉強や努力が不足してる奴が悪い」みたいなスタンスで接する人は、アプリ開発者には向きません。(昨今だと、どんな仕事でもじゃないかな🤔)
自分が発信するアプリのユーザーさんは、アプリのことなんて知らなくて当たり前なのに
👉知ってて当たり前みたいなことを周囲に言ってる人はデザインとか操作性の悪いアプリしか作れない
👉AppStoreに公開すらできないか、公開できてもユーザーさんからそっぽ向かれて誰にも使われない
が関の山だからね👀
とまあ、話が脱線したけど、先に読み進めると
メンバーシップに加入しとくと、エンジニアのサポートが受けられたり、
AppleDevelopersForum(以下、フォーラム)で、iOS開発者から問題解決を見つけてもらえたり
ベータ版をリリースできたり
AppStoreに販売
なんかができるから便利って言いたいみたいだね👀
とか言いつつ、次のセクションでは、まあ、まだ自分が勉強段階で、アプリの公開なんてすぐには考えていないなら、メンバーシップを購入しなくてもいいし、最初から購入しててもいいし、自分で好きにしなって書いてんね 藁🤣
この突き放してる感が、日本の古いだけで中身のうっすい教材よりも、よっぽど丁寧で親切メンバーシップがあれば何が出来て、どんなメリットがあるかだけ説明してるだけで、「だからメンバーシップへの加入は必須です。」みたいなことは一切書いてないからね。そらそんなもん、
年間99ドル=15,000円前後(個人的にはこれが高いか?🤔月に1300円、日に40円程度だぞ👀)
お金がかかるものだから、アップル自体加入を強制なんて一切してない。
"""
let pointEssentials3 = """
必要なのは、
・Xcodeが15
・SDKがiOS17
・macOS 13.5以上のバージョン
って書いてある👀確かめ方は、
Macを開いて、左上のアップルマークから、このMacについてをクリックすると、macOSってところに番号が書いてるからそこで確認できる〜〜〜
結構、古すぎるMacを中古品で買ったりすると、非対応とかサポート対象外でアップデートできないってこともあるから、慎重に調べてみてね。
次に、AppStoreを開いて、Xcodeを入手(無料だから安心してね)すれば、iOS17のSDKも一緒にインストールできるって書いてるから、特に問題なし。
ドックにある下図のマークをクリックして
表示されたAppStoreの画面の検索バーにXcodeって入れるだけ
検索すると、Xcodeが出てくる後は、インストールすればOK🕺

Xcodeのインストールが完了したら、ドックに追加されるであろうアイコンをクリックして、Create New Projectをクリックしたら、後は画面の指示に従って、新規プロジェクトを作成してくだけ〜〜〜
初回に関しては、IDと証明書関係の設定なんかが必要かもしれないんだけど、結構、ここの登録と追加って重要で、しばらくXcodeを開いてアプリを作ってなかったりすると、証明書とかアカウントが何故か消えていて、気づかずに実行すると、エラーが発生して焦ったりすることがあるから、何かコード以外でエラーが起きてるなって思った時に見返してみてね👀
"""

let pointEssentials4 = """
【テンプレートの違い】
・Blank:Swift コーディングを試す
・Game:SpriteKit フレームワークを試すことができる、事前構成されたプレイグラウンドを用意
・Map:iOS MapKit フレームワークを試すことができる、事前構成されたプレイグラウンドを用意
・Single View :ユーザー インターフェイス レイアウトを必要とするコードを試すためのビュー コントローラー環境を提供

【全体のポイント】
Playgroundだけでもすでにかなり内容が濃い感じで色々できるってことがわかるね👀
前々回で名前の付け方をやったと思うんだけど章の中で何個目のコードかって感じで、
var x4_2 = 1
みたいな感じで、番号を振っておくと、Playgroundで動かすときにはかなり便利。単純に、
var x = 1
だと、他のサンプルコードで、同じxが出てきたときにどうする?って話だし、見ただけで、
その章の何個目のサンプルコードかわかるからね🕺
"""

let pointEssentials5 = """
◾️Integer
 ・数を管理できるデータ型
 ・8、16、32、64ビットにも対応してるぞ👀
 ・UInt8、UInt16、UInt32、UInt64なんかもあるぞ
 ・それぞれ最小値と最大値の間の値までアクセスが出来る
◾️Floating
 ・FloatとDoubleから2つのタイプのFloating Point型を提供
 ・Floating型にもいくつかのタイプがある(32とか16とか)
◾️Bool
 ・条件なんかに当てはまっているかを、真(true:1)と偽(false :0)
◾️Character Data Type
 ・Character:””の中が1文字の文字列で処理されるもの
◾️String Data Type
 ・String:””の中が2文字以上の文字列で処理されるもの
◾️マルチライン(すでにやった複数行)
◾️特殊文字(=エスケープ文字)
 ・\n:改行
 ・\r:キャリッジリターン
 ・\t:水平タブ
 ・\\:バックスラッシュ
 ・\":ダブルクォーテーション
 ・\':シングルクォーテーション
 ・\\u{nn}:1バイトのユニコード
 ・\\u{nnnn}:2バイトのユニコード
 ・\\u{nnnnnn}:4バイトのユニコード
◾️変数
 ・処理の途中で、他の値に引数の値が変わる = 変数
◾️定数
 ・処理の中で変わらず定まった値 = 定数
◾️変数と定数の宣言
 ・変数の場合 : 頭にvarを付けて宣言
 ・定数の場合 : 頭にletを付けて宣言
◾️アノテーションと型推論
 ・引数(変数か定数): データ型 = ~
 ・型推論
◾️タプル
 ・Swiftで一番シンプルでパワフルな特徴のひとつ
 ・異なる型の複数の値をひとつの引数の中に、放り込める
◾️オプショナル型
 ・Null(入れ物はあるけど、中身が空っぽな状態)
 ・中身が空っぽな値を許容するか必ず何か(0も含めた)値が入らないといけないか
 ・nilを許容する=オプショナル型
◾️型のキャスト
 ・アップキャスティング : as!
 ・ダウンキャスティング : as?
"""

let pointEssentials6 = """
◾️意味不明なエラーが出た
👉辿っていくとvarで宣言したつもりがletで宣言してたorz
なんてのは、JavaScriptみたいな言語も使い慣れてると
やりがちなミスで焦る
◾️=:代入する記号やっでね。
◾️実際に動かしてみよう🕺
👉頭で理解してて実際に動かして検証しない
=想定通りの動きになってるかわからない
◾️頭で想定してるとおりの実行結果になるとは限らない
遠回りなようで近道
急がば回れ
100の思い込みよりも、ひとつの検証
頭で覚える、理解するよりも、実際に動かして、目と体で身に付けよ
◾️こんなの税とか金融システムの現場で、実際にやらかして
更新処理なんかをしてたらって考えるだけでも恐ろしい😱
"""

let pointEssentials7 = """
◾️範囲での繰り返し文:for
構文
for 回数 in コレクション か 範囲 {
   処理
}
後工程まで考えて最初から基本に忠実に、第三者が見ても見ればわかるように、極力、シンプルにコードは書く

◾️期間(前判定):while
構文
while 条件 {
  処理
}
・while : 条件式を満たす間は処理をする
・for:指定した回数だけ処理を繰り返す
↓
・値がいくらの間でやりたいのか
・指定した回数だけは確実に処理をしたいのか

◾️後判定:repeat
構文
repeat {
   処理
} while 条件
・while:条件の判定をしてから処理をする👉前判定
・repeat:少なくとも一回は処理に入ってから判定👉後判定

◾️BreakとContinue
・break:繰り返しを中断
・continue:繰り返しを抜けて次の処理に移る

◾️条件文:if
//単一条件
if 条件 {
 処理
}

//複数条件
if 条件1 {
 処理1
} else if 条件2 {
 処理2
} else if 条件n {
 処理n
} else {
 処理1、処理2、処理n以外の処理
}

◾️真偽値の偽の判定処理:guard
guard 真偽値 else {
  偽の場合だけの処理
}

まとめ
以前、他のマガジンの記事で
どんだけ大きなシステムも分解していけば、所詮小さなコードのかたまり
て書いたんだけど、所詮は、この制御文を使って、
その時々の要求に応じて、色々な繰り返しや判定、条件なんかで
処理を繰り返してるだけ
だからね👀まあ、言葉にしてしまうと、
当たり前っちゃあ当たり前
なんだけど、いざ自分でゼロからコードに起こすとかアプリを作るなんてやろうとすると、途端に
・手が動かなくなるか
・想定だけで検証もせずに、実際リリースしたらバグが出まくる
なんて人を山ほど見てるから、そんな時ほど、最初に戻るけど、
疑似コードプログラミング=PPP
で、
シンプルで第三者が初めても見ても何をしてるかわかる、読みやすいコードを起こす
をやってみてね〜〜〜〜🕺
"""
let pointEssentials8 = """
case:で網羅性がきちんと出来てないと、
意外と想定外の処理結果になったりするから気をつけてね👀
👉カバレッジ漏れに気をつけよう

for文の最初に持ってくるか、最後に持ってくるかで、
日曜始まりか月曜始まりになるか
変わってくるから気をつけてね

こんな単純な(動かせば気づく)ミスで、
大きな障害とかに繋がりやすいので〜〜〜

fallthrough:直下のケースの処理を実行する

Swift : break文いらない
他の言語の時に、つい癖でbreakを入れるの忘れる

オイラの場合、コードを書いたら、必ずすぐに検証する癖があるから、
すぐに、あ!そいえば、、、って感じですぐに気づくんだけど。
"""
let pointEssentials9_1 = """
func 関数名 (パラメータ名1: パラメータ1の型,パラメータ名2: パラメータ2の型,...) -> 戻り値の型{
   //処理
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
・func:ここはコンパイラーが関数と認識する予約語、宣言文みたいな感じ
・関数名:関数の名前
・パラメータ名:設定する引数なんかの名前
・パラメータの型:設定する引数なんかのデータ型
・戻り値の型:処理結果のデータ型
・処理:実行する処理

"""
let pointEssentials9_2 = """
{(パラメータ名1: パラメータ型1,パラメータ名2: パラメータ型2,...) -> 戻り値の型 in
    //処理
}
-----------------------------------------------------
・基本文法
・実際のXcodeでの作り方
・SwiftUIでできること、できないこと
をしっかり学んで、
・自分なりにどんなアプリを作りたいか
さえあれば、アプリなんて、
着手から数日で作れちゃうから焦る必要全くないしね👀
👉てか、焦る人ほど却って時間がかかる遠回りをする羽目になるし。
=「焦せる乞食は貰いが少ない」、「急がば回れ」
👉千里の道も一歩から。
どうせ、しっかり学んでいきゃ来年の今頃には、結構なアプリが自分で作れるようになってる
👉焦りは不要
"""

let pointEssentials10 = """
クリエイターの目線から(今回の一番大事なポイント)
オイラはいっつも、
コロナ禍でテレワークとかフルリモートなんかをやってると、
運動したくても出来ないことが多くなってたのに、
運動しましょうって感じで、今の体重が肥満かどうかを教えてくれる体重計とかはあるのに

何キロになったら肥満か
👉あと何キロまで太っても肥満じゃないか

を教えてくれる体重計がないのが不思議だったんだよね〜〜〜👀
まあ、去年、

まったり経営学|M_Kaku堂|note
日々読んだ経営学書の感想をまったり書いてるだけ💦
note.com
なんかで散々、書いたとおり、

健康維持には運動するのが当たり前ってレジティマシーが強い
👉脳筋マッチョな医学とかスポーツ界の常識

が原因なんだろうけど、

災害や事故で骨折してしばらく運動ができない

世界的な疫病で運動したくても、ジムが閉まっていて運動できない

なんて状況をオイラたちはここ数年で経験して、

スタンフォードの自分を変える教室 スタンフォード シリーズ
www.amazon.co.jp
814円
(2024年01月07日 16:48時点 詳しくはこちら)
Amazon.co.jpで購入する
でも書いてるハロー効果やドーパミン効果を悪用した、

不安を煽って消費に繋げる=悪意ある経済
👉ただお金が儲かれば良いのか?

から、

人の不安を煽らず必要な消費に繋げる=倫理ある経済
👉いかにお金を稼ぎ循環型の経済に社会を変えていくか

に繋がると思うしね、、、。この

略して、Essentials
のSyntax以降で出てくるであろうSwiftUIのフレームワークなんかで身長をメートル単位で入力だけしてもらえれば、

痩せ型は何キロ以下、肥満は何キロ以上

って判定や適正体重なんかも、

体重計なしにスマホひとつで計算できる

から、さっき書いたような事情で、運動がしたくても中々できないって人に、

無理に不安感を煽ったり、罪悪感を持って運動する

なんてことも減るだろうし、今、世界的な社会問題になりつつある
GLP-1受容体作動薬のダイエット目的の消費抑止にも繋がると思うしね。。。。👀そのきっかけは、ただ単に、
体重計で使ってるBMIの計算方法を逆転させただけ
👉よくいう発想の転換
(ゆーばかりでやれてない経営者ばかりだけど)
なんだけどね。ま、だからまだ運動しなくても大丈夫とか、健康を維持できるなんて豪語するつもりもないし、スマホアプリにそこまでの力なんてもちろんないけど、
テレワークや災害・事故、美容なんかで強迫観念を持ってる人の不安を少し減らすことができるかもしれない
👇
技術を正しく使えば、そんなことも出来るし、
最新の技術にはそんな力を秘めてる
ってことなんだけどね👀世の中に、数百万くらいあるスマホアプリを全部見てるわけでもないから、すでに存在してるかもしれないし、別にそれをオイラが作らないといけないとかこんなアイデアを独り占めする気もないから今ここで書いてるけどね。

どんな技術もツールも使い方ひとつで、
世界中のすべての人を幸せに豊かにすることも出来れば、
ごく一部の人間だけで、利益も富も独占出来るように悪用することも出来る

ってことで、、、。

去年で、
書きたかった記事はSwiftUI以外はあらかた全て書き終えてる(1年間で580記事くらいかな)から、今年からあんまり趣味のSwiftや古典、音楽、英語以外は書く気もないけどね。

オイラのこんな話なんて一個人のただの私見とか持論に過ぎないから、プロスペクト理論で、いくらでも

そうなるとは限らない

で一蹴してくれていいけど、年末年始も新聞を隅々まで読んでて今年は、

日本が色々な意味で完全に再生(ReStart ,Reset,Reborn)が始まる年

で、自分の所属する会社とか、研究室とか地域といった範囲でしか物事を見れなかった人たちが、

自分のいる産業、学会、社会といった範囲に行動範囲自体を広げないと淘汰されるしだろう。本格的に淘汰が始まる最初の年だろうな

って見てるんだよね👀実際、

すでに4月から運輸や医学会なんかで時間外労働の規制が始まることで去年から政治や経済が大好きな人たちは右往左往してるのが象徴的な出来事だしね。

遅延格納型プロパティ(lazy stored property)とは
プロパティの値を遅延評価で決定するクラス、または構造体のインスタンスプロパティのうち、格納型プロパティには、初期化の際には値を決めず、必要とされた時に初めて値を決定するという挙動を指定できる。
→プロパティとして定義した値を全て使うばかりではないし、計算コストを考えれば、必要な時まで決めないのは賢明
*タイププロパティは元々そんな値の決定の仕方

格納型プロパティの先頭にlazyを置く。
変数の型は明記しておいた方が安全。
定義できるのは、クラスか構造体の内部のみ。
プロパティの遅延評価=インスタンス生成後、インスタンス自体の値を変更する
👉定数ではなく、変数で宣言が必要。

・構造体の場合
そのプロパティの値を参照することによって遅延評価を引き起こす可能性のあるメソッドにはmutatingを付ける必要あり。

・遅延格納型プロパティには、プロパティオブザーバを設定できない。
・複数のスレッドが同時にプロパティにアクセスする状況で、初期化が一度だけ行われる保証はない。

しっかり理解せずに安易に、コードを修正すると、

まさに、

沼

にハマってしまうし、
実は複雑なコードでどうしても遅延バインディングをしないといけない時に、lazyを使うくらいな感覚で、ここは済ませて次に進んだ方がいい。

だから


の本文なんかで、

独学プログラミングのコツは紹介してるんだけどね💦👀

1周目でわからないことがあるくらい当たり前だし、
何かエラーがある度に全て一度で理解しようなんてしていたら、

他の理解できることを捨ててるようなもの
👉まさに、

木を見て森を見ず

になるからね。

ちなみにこの本で、
lazy

ってキーワードで本全体を検索してみたんだけど、

LazyGridLayout

なんかでヒットするだけで、Syntax以外でもほぼサンプルコードは出てこないみたいだから、

lazy =遅延バインディングで使う

だけを理解しておけばここでは十分。遅延バインディングすら、

複雑なURLSessionなんかでしか使うことがないからね。
👉いっぺんで理解しようとすることがそもそも挫折の原因
(オイラは記事を書いてる手前、2時間くらい調べたりはしてる程度。
そもそも1回で全てを理解してるとか、まだ、実践のコードを書いてもないのに、この本のコードを全て1回で暗記や理解するエンジニアなんていないし、それが出来たからって何の意味があるのかを逆に知りたいけどね👀)

目的は、

iOS17を学び直しがてら理解しつつ、

自分の作りたいアプリが最低限作れるようになればいいだけ

だからね。なので、以前の記事でも書いたけど、

自分が学ぶ目的は何かをしっかり見定めた上で学ぶことが大事

って書いた次第。ま、それでも

それくらいは理解するのがプロのエンジニアだ

これくらい1回で理解できないと優秀なエンジニアになれない

みたいな勝手なエンジニア像を思い描いて邁進したいなら、勝手にどうぞ。
そんなもん現場を知らない素人のただの思い込みだし、

ほぼ実務でも最初のうちは使わないモノまで全て一回で理解しようなんてやってる人も過去に見たことあるけど、ほぼほぼ挫折してる人ばかりだからね。
👉自分から挫折しにいくって愚か者としか言いようがないでしょ👀💦
"""
let pointEssentials11 = """
○継承:既存のクラスから新しいクラスを派生できるようにすることで、オブジェクト指向プログラミングにおけるオブジェクトの再利用の概念を拡張し、その後、それらの新しいクラスを拡張して新しい機能を追加
👉継承により、そのクラスを新しいサブクラスの基礎として使用できるようになる。
新しいサブクラスは親クラスのすべての機能を継承しますが、不足している機能を追加するために拡張できる。
○拡張:サブクラスを作成せずに既存のクラスに機能を追加する便利な代替オプションを提供。
って書いてるとおり、元々あるクラスやSwift本来の機能なんかを
再利用
して、
新たな独自の処理なんかを追加できるんだ
👉元々(何かしら)ある機能(処理)に、何かを追加したいときに使うんだ!
ってイメージしてもらえれば今は充分。
"""
let pointEssentials12 = """
クラスと構造体の違いっちゃあ何なん🧐?
違い① 取り扱う値がValue TypeかReference Typeか ?
構造体とクラスのインスタンスがコピーされるか、引数としてメソッドや関数に渡されるときに、動作に大きな違いが生じる。
・構造体のインスタンス=値型
・クラスのインスタンス=参照型
◾️構造体:
インスタンスがコピーされるかメソッドに渡される
👉インスタンス内に含まれるデータとともに、インスタンスの実際のコピーを作成。
👉コピーには、元の構造インスタンスと接続されていない独自のバージョンのデータ。
=実行中のアプリ内に構造体インスタンスの複数のコピーが存在。
👉それぞれが関連データの独自のローカル コピーを持つ。

⭐️構造体だと、1 つのインスタンスを変更しても、他のインスタンスには影響しない。

◾️クラス:
インスタンスがコピーされるか引数として渡される
👉やるのは、複製または渡されるのは、そのクラス インスタンスが存在するメモリ内の場所への参照だけ。
👉これらの参照を使用してインスタンスに加えられた変更をすべて、同じインスタンス上で実行。
=言い換えれば、クラス インスタンスは 1 つだけですが、それを指す参照が複数存在。

⭐️クラスだと、インスタンス データを変更すると、他のすべての参照のデータも変更される。

上の解説を見るだけでもわかると思うけど、
構造体で使うべきところで、クラスを使ってしまうと、大元のインスタンス自体の値を参照してるから、全て変更してしまう
👉処理結果が全然違うものになる危険性がある
構造体:大元のインスタンスは変わっていない
クラス:大元のインスタンスも変わってる

◇構造体:可能な限り構造体の使用をお勧め。
クラスよりも効率的であり、マルチスレッド コードでの使用がより安全であるため。
◇クラス:以下のいずれかの場合に使う。
「継承が必要」
「カプセル化されたデータのインスタンスが 1 つだけ必要」
「インスタンスの初期化が解除されたときにリソースを解放するために追加の手順を実行する必要」

要は、
  基本的には、構造体を使う。構造体で賄えない場合だけ、クラスを使う。

運用や保守、メンテナンスや安全性の観点から、
経験者が敢えてやっていないことを、誰もやっていない=自分はより高度なことができるって、クラスを覚え始めた駆け出しさんは勘違いしてやってしまう。
しかも、コードを頭で書いてすぐに実行して検証しない(=インスペクションの基本を習慣付けてない)から、大量のゴミコードを書いて、本番検証直前とか本番リリース後に初めて実行して発覚し、涙目😭
なんてことになるんだよね💦
💃構造体(struct)とクラス(class)の根本的な違いを分かってもらえれば十分🕺
"""
let pointEssentials13 = """
⭐️プロパティラッパー:構造体とかクラスなんかで状態を受け渡すために使う
SwiftUIフレームワークを使ったアプリの組み込みでよく使うプロパティラッパー
◾️State:変数に@Stateをつけると、その変数に変更が入ったら自動でviewを再構築
◾️Binding:Bindingの値を変更すると、その情報源(変数)に、値の変更を反映
◾️ObservedObject:ObservedObjectはObservableObjectを実装したクラスをwrappedValueとして持つ。
◾️ObservableObject:ObservableObjectはCombineフレームワークに含まれるプロトコルです。オブジェクトの変更を通知できることを表す。
◾️Published:変数に@Publishedを付与すると、その変数のprojectedValueは自身の変更を通知する
◾️EnvironmentObject:ObservableObjectを子ビューでも使いまわしたい場合は、@ObservedObjectではなく、@EnvironmentObjectを使用
◾️Environment:SwiftUIで定義されたViewの設定値を取得
"""
let pointEssentials14_1 = """
①配列の数え方(位置)は、プログラミング言語によりけりなんだけど、
左から0始まり : 左から1個目が0 👈 Swiftとか最近のはこっち
左から1始まり : 左から1個目が1 👈  COBOLとかはたしかこっち
て違いがあるから気をつけてね👀

②要素の追加をした後は、どっちの値を結果として出したいのか
で処理の順序を変える
👉追加前のままでいいか、追加後を含めたいか

③理由は簡単で、
let = 定数で定義しているから
配列に関しても、その後も変更される可能性がある場合は、
基本、変数=varで定義してあげる

④今までの処理で、
追加/挿入/削除/繰り返し
で結構、配列の値を変更してしまっているんだけど、みて貰えばわかるけど、オイラは、
結合後の配列しか使ってないよね?
これはなぜかと言えば、
結合元の配列さえ残しておけば、すぐに元に戻すことができるから

⑤「クライアントさんなんて、DBとか配列なんてよくわかってない」
「まだここの値段が決まってないんだけど、先にアプリを作って欲しい」
なんかで
こんなデータをCSVやLogなんかで出して要求してくるなんてザラ
だから、
応急的にやる時にはAnyを使うパターンもある
↓
規則性が分かってから、データを整理してわかりやすい配列や辞書にしてあげる

⑥頭の中だけでコードは書かずに、必ずコードを書いたら想定通りに動かした方がいい
"""
let pointEssentials14_2 = """
ここでポイント①
ユニークなキーで補完していて、キーには、以下の型しかできないみたいね
・String
・Int
・Double
・Bool

ま、やったことがある人間からしたら、「そりゃそーだし、それだけありゃ十分だろ」って感じなんだけど、やったことがない人にはイメージが湧かないだろうから
"""
let pointEssentials15 = """
・無意識に手が当たって、何かのコードが1文字消えた
↓
・バグ警告でバグfixできたので、表示上はバグが消えた:実際にはこれで8割ぐらいは解消できるんだけど、、、
↓
・実際に動かしてみたら、全然想定通りに動かないか、動的エラー発生
みたいな感じで、頭だけで書いたコードで、警告も出てないからOKで一回も検証しないままリリースとかすると後から涙目😢になるからね。

ここでポイント①:エラーハンドリングを理解する
1.iOS アプリのメソッド内で望ましい結果が得られない場合にエラーをトリガー (またはスロー) する
2.メソッドによってスローされたエラーをキャッチして処理する
↓
さらに、エラーがスローされた場合
・そのエラーは特定のタイプのエラーであり、これを使用してエラーの特定の性質を識別し、取るべき最も適切なアクションを決定できる。
・エラータイプの値には、エラー プロトコルに準拠する任意の値を指定できる。
"""

//URL
let urlSwiftUIMM1_1 = "https://note.com/m_kakudo/m/m681b1be679c5"
let urlDevEssentials1_1 = "https://sites.google.com/view/masaboct3/%E3%83%9B%E3%83%BC%E3%83%A0/"
let urlEssentials1 = "https://note.com/m_kakudo/n/n28c4d1b491e7"
let urlEssentials2 = "https://note.com/m_kakudo/n/n23f98cc63aee"
let urlEssentials3 = "https://note.com/m_kakudo/n/n5653a10d2cc7"
let urlEssentials4 = "https://note.com/m_kakudo/n/n5db03cd31141"
let urlEssentials5 = "https://note.com/m_kakudo/n/n87ebb286c1b5"
let urlEssentials6 = "https://note.com/m_kakudo/n/n8d342f5d8431"
let urlEssentials7 = "https://note.com/m_kakudo/n/nd42cef1bb81f"
let urlEssentials8 = "https://note.com/m_kakudo/n/ne914360177ea"
let urlEssentials9_1 = "https://note.com/m_kakudo/n/n0fb056cb4495"
let urlEssentials9_2 = "https://note.com/m_kakudo/n/nafe78303bdff"
let urlEssentials10_1 = "https://note.com/m_kakudo/n/n3eb8aed6473b"
let urlEssentials10_2 = "https://note.com/m_kakudo/n/nd12ab0e5dbf4"
let urlEssentials11 = "https://note.com/m_kakudo/n/nb37c842877ec"
let urlEssentials12 = "https://note.com/m_kakudo/n/n351fa9ffa7b2"
let urlEssentials13 = "https://note.com/m_kakudo/n/n57888b472cc4"
let urlEssentials14_1 = "https://note.com/m_kakudo/n/nb2031fc09971"
let urlEssentials14_2 = "https://note.com/m_kakudo/n/n034b91bea871"
let urlEssentials15 = "https://note.com/m_kakudo/n/nc0273cc3a5f5"


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