メインコンテンツへスキップ
見出し画像

【じっくりSw1ftUI 21】Essentials第9章〜Playgroundで遊ぼう⑦ファンクションとかメソッドとかクロージャとか❷クロージャあれこれ

    さてと前回、

    で

    画像

    の第9章途中でファンクションまで遊んで、区切りもちょうど良かったので、今回はその続き、

    クロージャ

    をやってく〜〜〜〜🕺第9章も残りあと少しだから頑張る😤

    では早速、

    クロージャをじっくり読んでこ

    構文

    {(パラメータ名1: パラメータ型1,パラメータ名2: パラメータ型2,...) -> 戻り値の型 in
        //処理
    }

    例えば、

    「20を3で割った数を計算したい」場合

    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)

    てな感じで、実行すると、、、

    画像
    てな感じで、計算結果を返す〜〜〜

    主に、

    システムの裏側で処理をさせる際に使えるのがクロージャってイメージ

    が大事みたいだね👀💦システムの裏側の処理ってゆーてオイラがパッと思い浮かべるのは、

    エラーハンドリング(エラー時の処理)

    なんだけど、実際次のサンプルが

    //実際のサンプル
    eventstore.requestAccess(
        to:.reminder,completion:{(granted:Bool, error: Error?) -> Void in
        if !granted {
            print(error!.localizedDescription)
        }
    })

    てな感じで載ってはいるんだけど、これが、

    画像
    てな感じで、赤いFatalな警告エラーになるので、

    なんかを参考に、ちょっと修正して、

    import EventKit
    
    //実際のサンプル
    let eventstore: EKEventStore = EKEventStore()
    
    eventstore.requestAccess(to:.reminder,completion:{(granted:Bool, error: Error?) -> Void in
        if !granted {
            print(error!.localizedDescription)
        }
    })

    てな感じで修正しても、、、

    画像
    どうやらすでにDeprecated=非推奨になってる様子👀

    そこで、、、

    で紹介した

    JumpToDefinition

    を使って調べられなくもないんだけど、この本では新出だし、

    requestAccessで検索してみると、、、

    なんかで確かに、書き方がすでに違ってるってなってるね
    (てか、2ヶ月くらい前に出たiOS17の最新の本を購入してるのに、iOS6時代に開発されたコードをそのままって🙄て感じだね💦)

    なので、

    なんかを参考に〜〜〜

    //実際のサンプル
    let eventstore: EKEventStore = EKEventStore()
    
    eventstore.requestWriteOnlyAccessToEvents(completion: {(granted:Bool, error: Error?) -> Void in
        if !granted {
            print(error!.localizedDescription)
        }
    })

    に変更すると、

    画像
    エラーが消えたし、
    //実際のサンプル
    let eventstore: EKEventStore = EKEventStore()
    
    eventstore.requestFullAccessToEvents(completion: {(granted:Bool, error: Error?) -> Void in
        if !granted {
            print(error!.localizedDescription)
        }
    })

    でも、

    画像
    同じくって感じだね、、、

    コードをもう一回きちんと付番までして整理〜〜〜

    //じっくり21で追加
    import EventKit
    
    //クロージャの使用例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
    }

    を、$0,$1,$2、、、て感じで省略することができる

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

    他にもこんな使い方もできるらしい

    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)

    で、

    画像

    今回のコードまとめ

    /**:---------------------------------------------------------
      Essentials 第9章 クロージャ
     -----------------------------------------------------------*/
    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)

    まとめ

    ま、エラーハンドリングや同期(async)処理なんかの時に、嫌ってくらいやるだろうから、

    システムの裏側で関数を使いながら処理をするときに、Closure(クロージャ)って書き方でやることもあるんだ👀
    (*構文だけでも触れて、こんな動きをするんだってことくらいは馴染んでおかないと、エラーと同期でいきなり出てくると苦労しそう)

    ってことがわかれば十分かなと、、、💦

    参考リンク

    前回分とまとめて〜〜〜〜

    Apple公式

    Apple公式以外

    さてと、次回は

    オブジェクト指向(志向)言語の基本にして、真骨頂

    💃Classの処理に入ってく〜〜〜!🕺

    余談だけど

    年末年始の休暇で、現在

    6連休中の2日目

    ではあるけど、

    Syntax(基本文法)をそんなに焦ってやっても仕方がない

    し、記事をたくさん作ることが目的ではなくあくまでも、

    じっくり自分自身が暇つぶしがてら学びなおす

    が主目的なので、

    今年の記事はここまで〜〜〜〜

    基本文法は、15章までなので残り6章
    この本全体も、66章くらいまでなので、残り51章

    で、こんだけじっくりまったりやっていても、実はすでに

    14%強

    は進んでるんだよね〜〜〜!

    • WWDCが毎年6月に、iOSの次バージョンのアップグレードが発表されて、

    • 実際のリリースが大体10月で、

    • それに対応した本が出るのもそれくらい

    だから、別にあと1年強は、

    iOS17が最新

    だし、

    • 基本文法

    • 実際のXcodeでの作り方

    • SwiftUIでできること、できないこと

    をしっかり学んで、

    自分なりにどんなアプリを作りたいか

    さえあれば、アプリなんて、

    着手から数日で作れちゃうから
    焦る必要全くないしね
    👀
    👉てか、焦る人ほど却って時間がかかる遠回りをする羽目になるし。
    =「焦せる乞食は貰いが少ない」、「急がば回れ」
    👉千里の道も一歩から。
    どうせ、しっかり学んでいきゃ来年の今頃には、
    結構なアプリが自分で作れるようになってる
    焦りは不要

    だからね🧐なんで、

    年末年始に休める時はしっかり休んだり、焦って先に進む暇があったら、今までの記事を読み返しながら、自分なりにいろんなコードを打ってみてね〜〜〜
    かくいうオイラも早く先に進んで、実践のXcodeでの打ち込みをしたいって気持ちでウズウズしてるけどね🤣

    💃疲れためて新年を迎えたくないからやらない🕺

    ではでは、この辺で

    今年も一年お世話になりました。
    来年もよろしゅう!!!

    記事公開後

    毎度の

    の手順で〜〜〜

    大目次

    画像
    第9章追加

    章見出し

    画像
    今回は2つに分けたけど、それも普通に対応可能
    👉だから、コードテンプレート〜〜〜

    ファンクション〜〜〜

    画像
    てな
    画像
    てな
    画像
    てなの、

    クロージャ〜〜〜

    画像
    てな
    画像
    感じで
    画像
    問題なし 笑

    コード

    Essentials9_1

    import SwiftUI
    import WebKit
    
    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

    import SwiftUI
    import WebKit
    
    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()
    }
    
    

    CodeManage

    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)
    """

    PointManage

    Essentialsの綴りが、全体的に、
    Essencialsになってたので、これを機会に正しい綴りに直した〜〜〜
    (気づいたときに直しとかないと、後々、数が増えてからだとめんどい💦)

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

    URLManage

    let urlEssentials9_1 = "https://note.com/m_kakudo/n/n0fb056cb4495"
    let urlEssentials9_2 = "https://note.com/m_kakudo/n/nafe78303bdff"

    iOSApp17DevelopmentEssentials

    import SwiftUI
    
    //ビュー管理構造体
    struct ListiOSApp17DevelopmentEssentials: Identifiable {
        var id: Int
        var title: String
        var view: ViewEnumiOSApp17DevelopmentEssentials
    }
    
    //遷移先の画面を格納する列挙型
    enum ViewEnumiOSApp17DevelopmentEssentials {
        case Ch1
        //じっくり13で追加
        case Ch2
        //じっくり13で追加
        case Ch3
        //じっくり15で追加
        case Ch4
        //じっくり16で追加
        case Ch5
        //じっくり17で追加
        case Ch6
        //じっくり18で追加
        case Ch7
        //じっくり19で追加
        case Ch8
        //じっくり20、21で追加
        case Ch9
    }
    
    //各項目に表示する文字列
    let dataiOSApp17DevelopmentEssentials: [ListiOSApp17DevelopmentEssentials] = [
        ListiOSApp17DevelopmentEssentials(id: 1, title: "第1章", view: .Ch1),
        //じっくり13で追加
        ListiOSApp17DevelopmentEssentials(id: 2, title: "第2章", view: .Ch2),
        //じっくり13で追加
        ListiOSApp17DevelopmentEssentials(id: 3, title: "第3章", view: .Ch3),
        //じっくり15で追加
        ListiOSApp17DevelopmentEssentials(id: 4, title: "第4章", view: .Ch4),
        //じっくり16で追加
        ListiOSApp17DevelopmentEssentials(id: 5, title: "第5章", view: .Ch5),
        //じっくり17で追加
        ListiOSApp17DevelopmentEssentials(id: 6, title: "第6章", view: .Ch6),
        //じっくり18で追加
        ListiOSApp17DevelopmentEssentials(id: 7, title: "第7章", view: .Ch7),
        //じっくり19で追加
        ListiOSApp17DevelopmentEssentials(id: 8, title: "第8章", view: .Ch8),
        //じっくり20、21で追加
        ListiOSApp17DevelopmentEssentials(id: 9, title: "第9章", view: .Ch9)
    ]
    
    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)
                })
            }
        }
    }
     #Preview  {
        iOSApp17DevelopmentEssentials()
    }

    iOSApp17DevelopmentEssentialsCh9

    import SwiftUI
    
    //ビュー管理構造体
    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: "ファンクション(function)", view: .Sec1),
        ListiOSApp17DevelopmentEssentialsCh9(id: 2, title: "クロージャ(closure)", view: .Sec2)
    ]
    
    struct iOSApp17DevelopmentEssentialsCh9: View {
        var body: some View {
            VStack {
                Divider()
                List (dataiOSApp17DevelopmentEssentialsCh9) { data in
                    self.containedViewiOSApp17DevelopmentEssentialsCh9(dataiOSApp17DevelopmentEssentialsCh9: data)
                }
                .edgesIgnoringSafeArea([.bottom])
            }
            .navigationTitle("9章目次")
            .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()
    }

    以上。

    じゃ、みなさんも良いお年を〜!


     
     
    タダの道楽者💫ネガティブなコメント一切お断り 裾野が広がりゃそれで良い 洋書と古典とSwiftをこよなく愛するオッさん👀 色即是空🕺 記事はマガジンの方が読みやすいかな💦 ちょい難とダラダラ💃 無駄な対立軸と課題探し思考は要らんな。 変幻自在➕縦横無尽➕融通無碍🟰天衣無縫

    あなたへのおすすめ