基本的な記法
@Enviroment(.\accessibilityEnabled) var accessibilityEnabled
関数定義
@propertyWrapper public struct Environment<Value> : DynamicProperty {
@inlinable public init(_ keyPath: KeyPath<EnvironmentValues, Value>(
@inlinable public var wrappedValue: Value { get }
}
なぜ @Enviroment
のように書けるのか
Swift5.1で追加された@propertyWrapperというattributeを型に付けると、@Environmentのようにアノテーションぽい記述を行うことができます。このマークを付けると、値のget set する際にpropertyWrapperをつけた型を経由することが出来ます。
なぜアノテーションの右に括弧があるのか
@propertyWrapperで指定した型にイニシャライザがある場合、引数はEnvironmentの場合は、KeyPathを引数に取って初期化されているので、@Environment(.\accessibilityEnabled)
のようになります。
指定するEnvironmentValuesは、かなり多くのプロパティを有しており、そのキーパスを渡す事でアクセスする仕組みになっています。
Dynamic Propertyとは何か
StateやBindingなども適合しているprotocolで、updateという必須実装の関数を一つだけ持っています。SwiftUIのモジュールに含まれています。
リファレンスを読むと以下のように書いてあります。
ドキュメント
Viewの外部プロパティを更新する格納変数
概要
Viewは、Viewのbodyを再計算する前にこれらのプロパティに値を提供します。
内容をまとめると**「Dynamic Propertyとは、View外部のプロパティを更新するためのstored propertyで、bodyの中身を再計算するより前の段階でViewによって値が与えられる」**となります。
このケースで考えると、@Enviroment(.\accessibilityEnabled) var accessibilityEnabled
のvar accessibilityEnabledの部分でstoredPropertyとして扱われていますね。説明を読むとこの環境値はbodyが計算される前に与えられているようなので、「Environmentの値の初期値がタイミングによっては取れない〜」みたいなことはなさそうですね。