💨

SwiftUI入門:データモデルからモーダル・ボタン・Optionalまで

に公開

この記事では、SwiftUI初心者向けに以下の内容を解説します。

  1. 座標を扱うCoordinates構造体
  2. @State$(Binding)の仕組み
  3. モーダル表示のためのfullScreenCover
  4. Buttonのイニシャライザ違い
  5. Optionalの強制アンラップ(!)の注意点

1. 座標を扱う Coordinates 構造体

struct Coordinates: Hashable, Codable {
    let latitude: Double
    let longitude: Double
}
  • struct: 値型でコピー渡し。安全に扱いやすい。

  • Hashable: SetDictionaryのキーに使える。

  • Codable: JSONEncoder/Decoderで自動的にエンコード/デコード。

  • プロパティ:

    • latitudelongitudeDouble 型で保持。
let tokyo = Coordinates(latitude: 35.6895, longitude: 139.6917)
// JSON変換も簡単
do {
  let data = try JSONEncoder().encode(tokyo)
  let str  = String(data: data, encoding: .utf8)
  print(str) // {"latitude":35.6895,"longitude":139.6917}
} catch {
  print(error)
}

2. @State$ の仕組み

@State private var isShowing = false
  • @State はSwiftUIの状態管理。
  • isShowing は中身の Bool (wrappedValue)。
  • $isShowingBinding<Bool> (projectedValue) を取得するためのシンタックス。
.fullScreenCover(isPresented: $isShowing) {
    // isShowing == true でモーダル表示
}
  • $ を付けると「双方向バインディング」を渡せる。
  • モディファイアや子ビューで値を書き戻したいときに使う。

3. モーダル表示:fullScreenCover

.fullScreenCover(isPresented: $isShowing) {
    // モーダルのコンテンツ
}
  • 動作:

    • isShowing = true で「表示」
    • isShowing = false で「閉じる」
  • ポイント:

    • モーダルを出すトリガーは自分で isShowing = true とする。
    • SwiftUIはBindingの変化を検知して自動で描画を切り替える。
Button("開く") {
  isShowing = true   // 明示的にフラグを立てる
}

4. Button のイニシャライザ違い

シンプル版

Button("計算") {
  // アクション
}
  • init(_ titleKey: LocalizedStringKey, action: @escaping () -> Void) を使用
  • テキストだけのラベルに最適

ラベル自由版

Button {
  // アクション
} label: {
  Text("計算")
}
  • init(action: @escaping () -> Void, @ViewBuilder label: () -> Label) を使用
  • アイコン+テキスト、カスタムViewなど複雑なラベルに対応

5. Optionalの強制アンラップ(!)

let value = Double(inputText)!  // Double? → Double
  • Double(inputText)Double? を返す。
  • ! を付けると中身を強制アンラップ。
  • 注意: nil のときはクラッシュ。

安全な書き方

if let value = Double(inputText) {
  // 安全に利用
} else {
  // 変換失敗時の処理
}

以上が今回学んだSwiftUI基礎解説です。

Discussion