【Swift UI】@Environmentとは?使い方と使用可能なキー値一覧
この記事からわかること
- Swift UIの@Environmentとは?
- @Environmentの使い方
- 取得できる環境値の一覧(EnvironmentValues)
index
[open]
\ アプリをリリースしました /
環境
- Xcode:15.0.1
- iOS:17.0
- Swift:5.9
- macOS:Sonoma 14.1
Swift5.1から導入された機能「Property Wrapper(プロパティラッパ)」の1つ@Environmentの使い方や取得できる値などをまとめていきたいと思います。
@Environmentとは?
@Environmentは@Stateや@Bindingなどと同じくSwift5.1から導入された機能「Property Wrapper(プロパティラッパ)」の1つです。プロパティラッパの特徴はプロパティ(変数)に対する操作や処理をカプセル化して定義することで特定のキーワードを追加するだけで任意の動作や挙動を行わせることができるデータ構造です。
その中でも@Environmentは環境値を読み取ることができます。環境値とはタイムゾーンやフォント、カラースキーム(ダークモードのON/OFF)などデバイスごとに設定されている値のことです。
似たようなProperty Wrapperに@EnvironmentObjectがありますがこちらはクラスに対して使用するProperty Wrapperです。
使い方
@Environmentとは他のProperty Wrapperとは違いプロパティの前につけるだけではなく、読み取る値のキー値を(\.キー値)形式で渡します。
@Environment(\.colorScheme) var colorScheme: ColorScheme
@Environment(\.キー値) var 変数名: [型]
環境値はiPhoneの設定などからユーザーによって変更された場合も自動で更新されます。
また基本的に環境値は読み取り専用でこちらから設定を変更することはできません。変更しようとすると以下のようなエラーを吐きます。
Cannot assign to property: 'colorScheme' is a get-only property
取得できる値のキー一覧(EnvironmentValues)
定義済みだけでなく独自で定義することも可能です。
| 値 | 概要 |
|---|---|
| accessibilityDifferentiateWithoutColor: Bool | 色なしで区別するためのシステム設定を有効にするかどうか |
| accessibilityEnabled: Bool | ユーザーアシスタントを使用しているかどうか |
| accessibilityInvertColors: Bool | ユーザーアシスタントの色の反転のシステム設定が有効かどうか |
| accessibilityLargeContentViewerEnabled: Bool | ラージコンテンツビューアが有効かどうか。 |
| accessibilityReduceMotion: Bool | システムの優先設定でモーションの軽減が有効になっているかどうか |
| accessibilityReduceTransparency: Bool | 透明度の軽減のシステム設定が有効かどうか |
| accessibilityShowButtonShapes: Bool | ボタンの形状を表示するためのシステム設定が有効かどうか。 |
| legibilityWeight: LegibilityWeight? | テキストに適用するフォントの太さ |
| dismiss: DismissAction | 現在のプレゼンテーションを閉じるアクション |
| dismissSearch: DismissSearchAction | 現在の検索インタラクションを終了するアクション。 |
| refresh: RefreshAction? | ビューの環境に格納された更新アクション |
| openURL: OpenURLAction | URLを開く |
| colorScheme:ColorScheme | 外観モードの設定 ダークモードかライトモードか |
| colorSchemeContrast:ColorSchemeContrast | ColorSchemeのコントラスト |
| controlSize:ControlSize | ビュー内のコントロールに適用するサイズ |
| controlProminence: Prominence | ビュー内のコントロールに適用するプロミネンス |
| controlActiveState: ControlActiveState | ビュー内のコントロールのアクティブな状態 |
| defaultWheelPickerItemHeight: CGFloat | 日付ピッカーなどのホイールスタイルピッカーのアイテムのデフォルトの高さ |
| headerProminence: Prominence | ビュー内のセクションヘッダーに適用するプロミネンス |
| menuIndicatorVisibility: Visibility | ビュー内のコントロールに適用するメニューインジケーターの可視性 |
| calendar: Calendar | ビューが日付を処理するときに使用する現在のカレンダー |
| locale: Locale | ビューが使用する現在のロケール |
| timeZone: TimeZone | ビューが日付を処理するときに使用する現在のタイムゾーン |
| displayScale: CGFloat | この環境の表示スケール |
| imageScale: Image.Scale | この環境の画像スケール |
| pixelLength: CGFloat | 画面上のピクセルのサイズ |
| isLuminanceReduced: Bool | ディスプレイに現在輝度を下げる必要があるかどうかを示すBool値 |
| editMode: Binding? | ユーザーがこの環境に関連付けられたビューのコンテンツを編集できるかどうかを示すモード |
| isEnabled: Bool | この環境に関連付けられたビューがユーザーの操作を許可するかどうかを示すBool値 |
| isFocused: Bool | 最も近いフォーカス可能な祖先にフォーカスがあるかどうかを返します |
| isPresented: Bool | この環境に関連付けられているビューが現在表示されているかどうかを示すBool値 |
| isSearching: Bool | ユーザーが現在、周囲の検索可能な修飾子によって配置された検索フィールドを操作しているかどうか |
| resetFocus: ResetFocusAction | デフォルトのフォーカスを再評価するようにフォーカスシステムに要求するアクション |
| keyboardShortcut: KeyboardShortcut? | この環境のボタンがトリガーされるキーボードショートカット |
| defaultMinListHeaderHeight: CGFloat? | リスト内のヘッダーのデフォルトの最小高さ |
| defaultMinListRowHeight: CGFloat | リスト内の行のデフォルトの最小高さ |
| backgroundMaterial: Material? | 現在のビューの下にあるマテリアル |
| redactionReasons: RedactionReasons | ビュー階層に適用される現在の編集理由 |
| scenePhase: ScenePhase | 現在のSceneのフェーズ |
| horizontalSizeClass: UserInterfaceSizeClass? | この環境の水平サイズクラス |
| verticalSizeClass: UserInterfaceSizeClass? | この環境の垂直サイズクラス |
| description: String | 環境値インスタンスの内容を表す文字列 |
| allowsTightening: Bool | 使用可能なスペースにテキストを収めるために文字間の間隔を狭める必要があるかどうかを示すBool値 |
| disableAutocorrection: Bool? | ビュー階層で自動修正が有効になっているかどうかを決定するBool値 |
| dynamicTypeSize: DynamicTypeSize | 現在の動的タイプのサイズ |
| font: Font? | この環境のデフォルトフォント |
| layoutDirection: LayoutDirection | 現在の環境に関連付けられているレイアウトの方向 |
| lineLimit: Int? | テキストがビューが占有できる最大行数 |
| lineSpacing: CGFloat | 1つのラインフラグメントの下部と次のラインフラグメントの上部の間のポイント単位の距離 |
| minimumScaleFactor: CGFloat | 使用可能なスペースにテキストを収めるためにフォントサイズを縮小するための最小許容比率 |
| multilineTextAlignment: TextAlignment | コンテンツが改行を折り返すか含むときに、テキストインスタンスがどのように行を揃えるかを示す値 |
| textCase: Text.Case? | 環境のロケールを使用して、表示時にテキストの大文字と小文字を変換するための文体のオーバーライド |
| truncationMode: Text.TruncationMode | レイアウトがテキストの最後の行を切り捨てて、使用可能なスペースに収まるようにする方法を示す値 |
| undoManager: UndoManager? | ビューの元に戻す操作を登録するために使用される元に戻すマネージャー |
| symbolRenderingMode: SymbolRenderingMode? | 現在のシンボルレンダリングモード、またはnilは、現在の画像と前景スタイルをパラメータとして使用してモードが自動的に選択されることを示します |
| symbolVariants: SymbolVariants | この環境で使用するシンボルバリアント |
| widgetFamily: WidgetFamily | ウィジェットのテンプレート—小、中、または大 |
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
私がSwift UI学習に使用した参考書





