Struct ModelをInitializerで、次のページへ渡す
次のページに構造体のモデルを渡したい
普段は、Dartで開発をしているのですが、コンストラクターというものをクラスに定義して、初期値を設定したり、初期化されたときの処理を書いております。
Swiftだと、Initializerと呼ばれているそうです。
初期化
型の保存されているプロパティの初期値を設定し、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