💨
SwiftUI入門:データモデルからモーダル・ボタン・Optionalまで
この記事では、SwiftUI初心者向けに以下の内容を解説します。
- 座標を扱う
Coordinates構造体 -
@Stateと$(Binding)の仕組み - モーダル表示のための
fullScreenCover -
Buttonのイニシャライザ違い - Optionalの強制アンラップ(
!)の注意点
1. 座標を扱う Coordinates 構造体
struct Coordinates: Hashable, Codable {
let latitude: Double
let longitude: Double
}
-
struct: 値型でコピー渡し。安全に扱いやすい。 -
Hashable:SetやDictionaryのキーに使える。 -
Codable:JSONEncoder/Decoderで自動的にエンコード/デコード。 -
プロパティ:
-
latitude・longitudeをDouble型で保持。
-
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)。 -
$isShowingはBinding<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