見出し画像

【じっくり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()
}

以上。

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


いいなと思ったら応援しよう!