🪶

Struct ModelをInitializerで、次のページへ渡す

2024/07/24に公開

次のページに構造体のモデルを渡したい

普段は、Dartで開発をしているのですが、コンストラクターというものをクラスに定義して、初期値を設定したり、初期化されたときの処理を書いております。

Swiftだと、Initializerと呼ばれているそうです。

official

初期化

型の保存されているプロパティの初期値を設定し、1回限りのセットアップを行う。

初期化とは、クラス、構造体、列挙のインスタンスを使用できるように準備するプロセスです。このプロセスでは、インスタンスに格納されている各プロパティに初期値を設定し、新しいインスタンスを使用できるようにする前に必要なその他の設定や初期化を実行します。

特定の型の新しいインスタンスを作成するために呼び出される特別なメソッドのようなものであるイニシャライザを定義することによって、この初期化プロセスを実装します。Objective-C のイニシャライザとは異なり、Swift のイニシャライザは値を返しません。彼らの主な役割は、型の新しいインスタンスが初めて使用される前に正しく初期化されることを保証することです。

クラス型のインスタンスは、そのクラスのインスタンスが割り当て解除される直前にカスタム・クリーンアップを実行する、deinitializerを実装することもできます。非初期化の詳細については、非初期化を参照してください。

今回やること

Carというstructを定義して、carsというArrayにダミーの車の情報を格納して、Listに表示して、NavigationStackで、次のページに画面遷移したときに渡す仕組みになっております。

まずは、値を受け取るページを作成します。

struct Car {
    var make: String
    var model: String
    var year: Int
}

import SwiftUI

struct ContentView: View {
    // japanese car array
    let cars = [
        Car(make: "Toyota", model: "Corolla", year: 2021),
        Car(make: "Honda", model: "Civic", year: 2021),
        Car(make: "Nissan", model: "Sentra", year: 2021)
    ]

    var body: some View {
        VStack {
            Image(systemName: "car")
                .imageScale(.large)
                .foregroundStyle(.tint)
            
            // NavigationView
            NavigationStack {
                List(cars, id: \.make) { car in
                    NavigationLink(destination: CarDetailView(car: car)) {
                        Text(car.make)
                    }
                }
                .navigationTitle("Cars")
            }
        }
        .padding()
    }
}

struct CarDetailView: View {
    var car: Car

    var body: some View {
        VStack {
            Text("Make: \(car.make)")
            Text("Model: \(car.model)")
            Text("Year: \(car.year)")
        }
    }
}

#Preview {
    ContentView()
}

画面遷移するコードを書いている場所で、値を渡せば次のページに、Car Modelの値を表示することができます。

VStack {
            Image(systemName: "car")
                .imageScale(.large)
                .foregroundStyle(.tint)
            
            NavigationStack {
                List(cars, id: \.make) { car in
                    NavigationLink(destination: CarDetailView(car: car)) {
                        Text(car.make)
                    }
                }
                .navigationTitle("Cars")
            }
        }
        .padding()

[全体のコード]

struct Car {
    var make: String
    var model: String
    var year: Int
}

import SwiftUI

struct ContentView: View {
    // japanese car array
    let cars = [
        Car(make: "Toyota", model: "Corolla", year: 2021),
        Car(make: "Honda", model: "Civic", year: 2021),
        Car(make: "Nissan", model: "Sentra", year: 2021)
    ]

    var body: some View {
        VStack {
            Image(systemName: "car")
                .imageScale(.large)
                .foregroundStyle(.tint)
            
            // NavigationView
            NavigationStack {
                List(cars, id: \.make) { car in
                    NavigationLink(destination: CarDetailView(car: car)) {
                        Text(car.make)
                    }
                }
                .navigationTitle("Cars")
            }
        }
        .padding()
    }
}
// next page#Preview {
    ContentView()
}

🧑‍💻動作はこんな感じです


まとめ

今回は、Initializerを使って複数の値を受け取るのをやってみました。よく使う方法なので、覚えておいてください。

Discussion