LoginSignup
0
2

More than 3 years have passed since last update.

【SwiftUI】@Environmentを支える機能

Last updated at Posted at 2020-01-21

基本的な記法

sample.swift
@Enviroment(.\accessibilityEnabled) var accessibilityEnabled

関数定義

definition.swift
@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の値の初期値がタイミングによっては取れない〜」みたいなことはなさそうですね。

参考

SwiftUI徹底入門

apple doc

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2