SwiftUIのFormは、iOSのSettingsのデザインに従った、構造化された設定とデータ入力インターフェースを構築するためのコンテナコンポーネントです。このコンポーネントは自動的にコントロールをセクションにグループ化し、システムのスペーシングとスタイルを適用するため、開発者は手動でセパレーターや色を調整する必要がありません。Apple Developer Documentation(2025)によると、Formは各プラットフォームに外観を適応させます — iOSのグループ化テーブルからmacOSの標準リストまで — 統一されたAPIを維持しながら。
重要なポイント
Formは、入力フォームや設定画面を作成するために設計された特別なSwiftUIコンテナです。Listの動作を継承しつつ、プラットフォーム固有のスタイルを追加します:iOSでは、Formは角丸のセクションを持つグループ化テーブルとして表示されます。macOSでは、チェックボックスとコントロールを備えた標準のシステムリストとして表示されます。
VStackやHStackを使った手動レイアウトとは異なり、Formは自動的に要素間のスペーシングを調整し、セパレーターを追加し、システムテーマ(ライトまたはダーク)に応じて外観を適応させます。開発者は論理構造のみを記述します:グループ化のためのSectionと内部のコントロール。フォーム自体が、特定のプラットフォームでPicker、Toggle、Stepperをどのように視覚的に配置するかを決定します。
Formはすべての標準SwiftUI入力要素をサポートしています:テキスト用のTextField、パスワード用のSecureField、リスト選択用のPicker、オン/オフ用のToggle、範囲用のSlider、段階的値用のStepper、日付用のDatePicker。各要素は自動的にターゲットプラットフォームのAppleのHIG(Human Interface Guidelines)に準拠したスタイルを取得します。
見た目の類似性にもかかわらず、FormとListは異なるタスクを解決します。Listは、スワイプ操作と行編集機能を備えたスクロール可能なデータリストを表示するための汎用コンテナです。Formはデータ入力と設定のための専門的なコンテナで、システムコントロールスタイルに最適化されています。
Listは動的データの表示に適しています:ニュースフィード、チャット、商品カタログ。Formは予測可能なフィールドセットを持つ静的な画面に適しています:ユーザープロフィール、アプリ設定、登録フォーム。主な違い:Formの要素はインタラクティブなコントロールにできるのに対し、Listの行は主にデータを表示し、タップにナビゲーションやアクションで応答します。
| パラメータ | Form | List |
|---|---|---|
| 目的 | データ入力、設定 | リスト表示 |
| セクションスタイル | Grouped(iOS)、システム(macOS) | PlainまたはGrouped |
| コントロール | Picker、Toggle、Slider、Stepper | 制限あり(ボタン) |
| 動的データ | 制限あり(Section内のForEach) | 完全サポート |
| スワイプ操作 | はい、swipeActions | はい、swipeActions |
Apple Human Interface Guidelines(2025)によると、Formは1画面に3〜20個のコントロールがあり、セクションに分割することでユーザビリティが向上する設定画面や入力画面に使用する必要があります。
SectionはFormの主要な構成要素であり、論理的に関連する要素をグループ化できます。各Sectionにはヘッダー、フッター、および内部に任意の数のコントロールを含めることができます。システムは自動的にセクション間にスペーシングを追加し、各セクションを角丸の視覚ブロックでラップします。
Sectionの使用はフォームの読みやすさにとって重要です:意味ごとにグループ化された要素はユーザーが処理しやすくなります。例えば、プロフィール設定画面では、「個人データ」「通知」「セキュリティ」を個別のセクションに分けることができます。各セクションには説明テキストを含むフッターを含めることができ、システムは要素グループの下に小さなフォントで表示します。
Form {
Section(header: Text("プロフィール")) {
TextField("名前", text: $name)
TextField("Email", text: $email)
}
Section(header: Text("通知"),
footer: Text("会議中は無効にする")) {
Toggle("Push notifications", isOn: $pushEnabled)
Toggle("Email notifications", isOn: $emailEnabled)
}
}
この例では、最初のセクション「Profile」にはフッターなしの2つのテキストフィールドが含まれ、2番目のセクション「Notifications」にはグループの下に説明付きの2つのトグルが含まれています。フッターは自動的にスペーシングを追加し、captionフォントスタイルを使用します。Sectionはヘッダーなしでフッターを持つか、フッターなしでヘッダーを持つことができます。
Formはすべての標準SwiftUI入力要素をサポートしています。PickerはForm内で自動的に、iOSでは個別の選択画面へのナビゲーション行として表示されます。Toggleは右揃えのスイッチ付きの行として表示されます。TextFieldはプレースホルダー付きのシステム入力スタイルを取得します。
数値にはStepper(段階的変更)とSlider(範囲内のスムーズな変更)が使用されます。DatePickerは複数のモードをサポート:date、time、dateAndTime。色選択にはColorPickerが利用可能です。各要素は追加コードなしでプラットフォームに適応します — iOSではコントロールはネイティブのUIKitスタイルを使用し、macOSではAppKitを使用します。
| 要素 | 目的 | Formのスタイル |
|---|---|---|
| TextField | テキスト入力 | プレースホルダー付き行 |
| SecureField | パスワード入力 | 非表示文字付き行 |
| Picker | リスト選択 | 選択画面へのNavigationLink |
| Toggle | オン/オフ | スイッチ付き行 |
| Slider | 値の範囲 | 水平スライダー |
| DatePicker | 日付/時刻選択 | コンパクトまたはホイールスタイル |
Form内のカスタムコントロールには、任意のSwiftUI Viewを使用できます — 標準のセクション動作を継承します。ただし、HIG準拠を保証し、追加設定なしでアクセシビリティ(VoiceOver、Dynamic Type)をサポートするため、システム要素に従うことをお勧めします。
Formを使用して登録画面を作成しましょう。フォームには4つのセクションがあります:個人データ、役割選択、サブスクリプション設定、送信ボタン。グループ化にはSectionと標準のSwiftUIコントロールを使用します。
struct RegistrationForm: View {
@State private var name = ""
@State private var email = ""
@State private var role = "Developer"
@State private var agreedToTerms = false
let roles = ["Developer", "Designer", "Manager"]
var body: some View {
NavigationStack {
Form {
Section(header: Text("個人情報")) {
TextField("Name", text: $name)
TextField("Email", text: $email)
.keyboardType(.emailAddress)
}
Section(header: Text("役割")) {
Picker("Select role", selection: $role) {
ForEach(roles, id: \.self) { role in
Text(role).tag(role)
}
}
}
Section {
Toggle("Agree to terms", isOn: $agreedToTerms)
}
Section {
Button("登録") {
submitForm()
}
.disabled(!agreedToTerms)
}
}
.navigationTitle("Registration")
}
}
private func submitForm() { }
}
フォームは4つのSectionに分割されています:2つのテキストフィールドを持つ個人データ、Pickerによる役割選択、Toggleによる利用規約への同意、登録ボタン。ボタンはユーザーが利用規約に同意するまで無効になっています — これはForm内でのバリデーションの例です。NavigationStackはタイトルを追加し、PickerがiOSで個別の選択画面を開くことを可能にします。
struct SettingsForm: View {
@State private var volume: Double = 0.5
@State private var isDarkMode = false
@State private var reminderDate = Date()
var body: some View {
NavigationStack {
Form {
Section(header: Text("外観")) {
Toggle("Dark mode", isOn: $isDarkMode)
Slider(value: $volume, in: 0...1) {
Text("音量")
}
}
Section(header: Text("リマインダー"),
footer: Text("選択した時間に通知が届きます")) {
DatePicker("Remind at",
selection: $reminderDate,
displayedComponents: .hourAndMinute)
}
Section {
NavigationLink("Advanced Settings",
destination: AdvancedSettingsView())
}
}
.navigationTitle("Settings")
}
}
}
この例は、Form内でのSlider、DatePicker、NavigationLinkの組み合わせを示しています。DatePickerは時間のみを表示するためにhourAndMinuteモードを使用します。最後のセクションのNavigationLinkは詳細設定画面への遷移を作成します — Settings風インターフェースの一般的なパターンです。セクションのヘッダーとフッターによりフォームは自己文書化され、ユーザーは各コントロールがどのグループに属するかを即座に理解できます。
よくある質問
Formはデータ入力と設定に最適化されています:コントロールはシステムスタイルを取得し、セクションは角丸とスペーシングを取得します。Listはデータ表示のための汎用コンテナです。Formは設定画面に適しており、Listはチャット、フィード、カタログに適しています。
はい、Form内のPickerは自動的に、iOSでは選択値とリスト選択用のNavigationLinkを持つ行として表示されます。macOSでは、Pickerはスタイルに応じてドロップダウンリストまたはラジオグループとして表示されます。適応は追加コードなしで行われます。
任意のSwiftUI ViewをFormまたはSection内に配置できます。カスタムコントロールの場合は、標準のセクションスペーシングを継承し、システムフォントを通じてDynamic Typeをサポートすることをお勧めします。すべてのデバイスでフォームが正しく表示されるように、固定サイズや色は避けてください。
はい、コンテンツが画面の高さを超える場合、Formは自動的にScrollViewにラップされます。ScrollViewを手動で追加する必要はありません — システムがスクロールの必要性を自動的に判断します。スクロールすべきでないフォームには、固定高さのVStackを使用してください。
iOSのFormは、.formStyle(.grouped)修飾子を通じて2つのスタイルをサポートしています — 角丸セクションを持つ標準のグループ化ビュー。macOSでは、複数列レイアウトの.formStyle(.columns)が利用可能です。スタイルはForm全体に一度に適用され、内部のすべての要素の視覚的表現を変更します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。