Developmentここで言うSingletonというのは、ある種のグローバル変数を指している。そもそもクライアントアプリケーションの開発においては、実質的なグローバル変数が出現しやすい。環境にたった一つしか存在しない、存在すべきでない、というものが見出せる。タイムゾーンがそれである。アプリケーション内のタイムゾーンはシステムに合わせるのが自然であり、アプリケーション中で複数存在することはほとんど起こり得ない。frameworkのTimeZoneである。システムのタイムゾーンはTimeZone.currentで取得できる。これはSingletonパターンのインターフェースに近い(本当にインスタンスが一つであるかどうかをここでは問題にしない)。このように環境中で存在する個数が限定されるような値を表すのに、Singletonパターンが用いられることがある。Singletonパターンを用いると、単体テストを書くのに不便だったり、あるいは多用することでコードベースのメンテナンス性が低下するなどとして、嫌われることも多い。このような問題は、DIのようなアプローチを用いることで軽減できるだろう。SwiftUIのEnvironmentSwiftUIでは、タイムゾーンの取得に@Environmentを使う。以下のようにしてTimeZoneのインスタンスを得られる。wrapperを使い、EnvironmentValuesのpropertyをKeyPathとして(\.timeZoneのように)与えると、環境の値を読み取ることができる。Environmentの上書き環境の値は上書きすることもできる。modifierを呼び出すと、そのviewの子孫の環境を上書きできる。"GMT")!)全てを上書きできるわけではなく、EnvironmentValuesのpropertyにsetが設定されているものだけを上書きできる。タイムゾーンを上書きするのはあまり有意義とは言えないが、例えばEnvironmentValues.isEnabledを上書きするのは理解しやすいユースケースである。特定のview以下を全てdisabledにするのは、リーズナブルだ。false)のショートハンドであろう。新しいEnvironmentを作るEnvironmentValuesを拡張してpropertyを追加することで、独自の値をEnvironmentに持たせることができる。propertyは追加できないが、幸いなことにEnvironmentValuesはEnvironmentValues.subscript(_:)によってストレージを提供してくれる。macOSで、viewが所属するNSWindowを環境から取得できるようにしてみる。(Singletonの例にはならないが......。}}このようにEnvironmentKeyに準拠した型を作って、EnvironmentValuesを拡張する。以下のように、NSHostingViewを初期化するときにNSWindowへの参照を与える。windowとして、NSWindowにアクセスできる。EnvironmentとDIコンテナこうしてみると、EnvironmentはViewをターゲットとしたDIコンテナのような役割を果たしている。これはObservableObjectを対象としたEnvironmentObjectでも同じだが、Environmentの場合はObservableObject以外もその対象になる。Environmentは、ViewModifierからも参照できる。EnvironmentalModifierがそれだ。EnvironmentalModifierは、それ自体がViewModifierでありながら、resolve(in:)メソッドを実装することで、EnvironmentValuesの値を元にして別のViewModifierを解決することができる。EnvironmentはViewModifierに対しても依存を提供できる。DIコンテナとしては万能ではないが、これまでSingletonパターンを使っていたようなものの置き換えとしては十分だろう。EnvironmentとContextReactに親しんでいれば、EnvironmentはReactのContextとほとんど同じということに気づくだろう。Reactでは内部的にContextを使って実現されるようなライブラリと似たようなことが、Environmentでも実現できそうだ。まとめSwiftUIのEnvironmentを説明して、独自に拡張する方法を紹介した。DIコンテナとの類似性から、Singletonパターンの置き換えとしての可能性を示した。SwiftUIは昨秋にリリースされたばかりで、不完全な印象を抱きがちではあるが、Environmentのような仕組みがしっかりと整備されており、高いポテンシャルを持っているように思う。検索リンクはてなブログブログをはじめる(無料)お知らせ最新記事SwiftUIではSingletonの代わりにEnvironmentを使うことができる紛らわしい文字列をもっと紛らわしくするapple/swift-formatを試す息子にカメラを与えるCoreImage.CIFilterBuiltins月別アーカイブはてなブログをはじめよう!cockscombさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。