【じっくり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)
}
})
てな感じで載ってはいるんだけど、これが、
なんかを参考に、ちょっと修正して、
import EventKit
//実際のサンプル
let eventstore: EKEventStore = EKEventStore()
eventstore.requestAccess(to:.reminder,completion:{(granted:Bool, error: Error?) -> Void in
if !granted {
print(error!.localizedDescription)
}
})
てな感じで修正しても、、、
そこで、、、
で紹介した
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での打ち込みをしたいって気持ちでウズウズしてるけどね🤣
💃疲れためて新年を迎えたくないからやらない🕺
ではでは、この辺で
今年も一年お世話になりました。
来年もよろしゅう!!!
記事公開後
毎度の
の手順で〜〜〜
大目次
章見出し
ファンクション〜〜〜
クロージャ〜〜〜
コード
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()
}
以上。
じゃ、みなさんも良いお年を〜!