🙆♀️
# 【Day6】SwiftUIセクション3で爆死したけど学びはデカかった話
はじめに 📘
こんにちは!やすです。
今日もApple公式のSwiftUIチュートリアルを進めました。今回はセクション3「Handling User Input」へ突入!……したのは良いものの、ミス連発で頭抱えました(笑)
でも、そのぶん「Bindingってこういうことか!」「ModelDataの扱いってこうなってるんだ!」みたいな理解が深まった日でもありました。
この記事では、その学びとやらかしをまとめます。
今日やったこと ✅
- セクション3「Handling User Input」に挑戦
- @Binding の使い方を実践
- Toggleの状態でフィルタリング
- modelData と landmark の紐付け
- PreviewWrapperの追加とデバッグ
やらかしたこと ❌
🔻 NavigationSplitView の二重定義エラー
NavigationSplitView を ContentView にも LandmarkList にも書いてたせいでエラーに。
➡️ NavigationSplitView は アプリ内で1箇所にすべし。
🔻 Toggle の書き方ミス
Toggle(isOn: $showFavoritesOnly) {
text("Favorites only")
}
「text」が小文字になっててエラー!正しくは Text("Favorites only")
。
➡️ Swiftは型名の頭文字が大文字なのを忘れずに!
🔻 Preview で環境データ渡さずエラー
@Environment(ModelData.self) を使ってるのに、Preview側で .environment(modelData)
を渡してなかった。
➡️ 環境オブジェクトが必要なViewは、Previewでも渡す必要がある!
深まった理解 ✍️
@Binding
の本質
💡 - 親Viewの状態を子Viewに渡して、双方向で値をやりとりできる。
-
.constant(true)
は固定値だから変更不可。Preview専用で使う!
landmarkIndex
とは?
💡 var landmarkIndex: Int {
modelData.landmarks.firstIndex(where: { $0.id == landmark.id })!
}
→ 現在表示してるランドマークが配列の中で何番目かを取得する。
→ データを直接更新するために必要。
@Environment
の注意点
💡 -
.environment(_:)
で渡さないと Preview が落ちる。 - Viewの外で定義したデータは 自動で注入されない。
明日への課題 🔜
- セクション3の仕組みをコードレベルでもう一度復習する
- @State と @Binding と @Environment の違いを表にまとめる
- NavigationSplitViewの構造をノートに図解
おわりに 🍵
今日は正直きつかったです。ミスの連続で「俺センスないかも…」って一瞬思ったけど、それでもコードが動いたときの「うおっしゃあ!」感はすごかった。
この感覚を味わい続けるために、明日もやってやります!Zennに記録を残すのも、自分への応援だと思って続けていきます🔥
読んでくれてありがとう!同じように挑戦してる人、一緒に頑張ろう!
Discussion