XCode 16.4 日本語化計画:
ビューの環境から値を読み取るプロパティラッパー。
@frozen @propertyWrapper struct Environment<Value>
SwiftUI を使用したメニューバーの構築とカスタマイズ
(Building and customizing the menu bar with SwiftUI)
検索インターフェースのアクティベーションの管理
(Managing search interface activation)
ビューの環境に格納されている値を読み取るには、Environment プロパティラッパーを使用して下さい。プロパティ宣言で EnvironmentValues キーパスを使用して、読み取る値を指定します。例えば、colorScheme プロパティのキーパスを使用して、現在のビューのカラースキームを読み取るプロパティを作成できます。
ビューのコンテンツは、宣言されたプロパティの wrappedValue から読み取った関連値に基づいて条件付けできます。他のプロパティラッパーと同様に、ラップされた値にアクセスするには、プロパティを直接参照します。
if colorScheme == .dark { // Checks the wrapped value.
DarkContent()
} else {
LightContent()
}
値が変更されると、SwiftUI はその値に依存するあなたのビューのすべての部分を更新します。例えば、上記の例では、ユーザーが外観設定を変更した場合にこれが起こります。
このプロパティラッパーを使用して環境値を読み取ることはできますが、設定することはできません。SwiftUI は、システム設定に基づいて一部の環境値を自動的に更新し、その他の環境値には適切なデフォルト値を提供します。environment(_:_:) ビュー修飾子を使用して、これらの環境値の一部をオーバーライドしたり、独自に定義したカスタム環境値を設定したりできます。
SwiftUI が提供する環境値の完全なリストについては、EnvironmentValues 構造体のプロパティを参照してください。カスタム環境値の作成方法については、Entry() マクロを参照してください。
Environment を使って、ビューの環境から監視可能なオブジェクトを取得することもできます。監視可能なオブジェクトは Observable プロトコルに準拠していなければならず、あなたのアプリはオブジェクト自体またはキーパスを使用して、そのオブジェクトを環境に設定しなければなりません。
オブジェクト自体を使用してオブジェクトを環境に設定するには、environment(_:) 修飾子を使用します。
@Observable
class Library {
var books: [Book] = [Book(), Book(), Book()]
var availableBooksCount: Int {
books.filter(\.isAvailable).count
}
}
@main
struct BookReaderApp: App {
@State private var library = Library()
var body: some Scene {
WindowGroup {
LibraryView()
.environment(library)
}
}
}
その型を使用して監視可能なオブジェクトを取得するには、プロパティを作成し、Environment プロパティラッパーにオブジェクトの型を提供します。
struct LibraryView: View {
@Environment(Library.self) private var library
var body: some View {
// ...
}
}
デフォルトでは、オブジェクト型をキーとして環境からオブジェクトを読み取ると、オプショナルでないオブジェクトが返されます。このデフォルトの動作は、現在の階層内のビューが、environment(_:) 修飾子を使用して、その型のオプショナルでないインスタンスを以前に保存していることを前提としています。ビューがその型を使用してオブジェクトを取得しようとし、そのオブジェクトが環境内に存在しない場合、SwiftUI は例外を throw します。
オブジェクトが環境内に存在する保証がない場合は、以下のコードに示すように、オブジェクトのオプショナルのバージョンを取得して下さい。オブジェクトが環境で利用できない場合、SwiftUI は例外を throw する代わりに nil を返します。
キーパスを持つオブジェクトを設定するには、environment(_:_:) 修飾子を使用します。
@Observable
class Library {
var books: [Book] = [Book(), Book(), Book()]
var availableBooksCount: Int {
books.filter(\.isAvailable).count
}
}
@main
struct BookReaderApp: App {
@State private var library = Library()
var body: some Scene {
WindowGroup {
LibraryView()
.environment(\.library, library)
}
}
}
オブジェクトを取得するには、プロパティを作成し、キーパスを指定します。
struct LibraryView: View {
@Environment(\.library) private var library
var body: some View {
// ...
}
}
指定されたキーパスを読み取るための環境プロパティを作成します。
環境プロパティの現在の値。
DynamicProperty
SendableMetatype
ビュー階層を通じて伝播される環境値のコレクション。