🙆‍♀️

# 【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