どのようにSwiftuiの助けを借りてカスタムプロパティのラッパーを書くには?


あなたはどのようにスウィフトのプロパティラッパーの周りにあなたの頭をラップすることができます任意のアイデアがありますか?しかし、私は迅速なUIと関連の仕事についての詳細を掘っている.そして、1つの挑戦を見つけました.そして、それはSwiftuiの環境から依存性をカスタム・プロパティ・ラッパーに通過しています.研究の間、DynamicPropertyプロトコルがあなたの資産ラッパーを確認するものであるということを知りました.プロパティラッパーがDynamicPropertyプロトコルに準拠するとき、それは効果的にあなたのSwiftUIビューのコンポーネントになります.したがって、あなたのSwiftuiビューは、あなたのビューのボディを評価することについて、いつでも自分自身を更新するプロパティラッパーを要求します.また、プロパティラッパーは、Swiftui環境からデータを抽出します.
したがって、ビューの更新をトリガーするには、プロパティラッパーで@ stateObjectプロパティを使用できます.IOS開発者でさえ、開発中にプロパティラッパーの変更を行います.それで、話題に深く行く前に、最初に、どのようなDynamicpropertyがあるかについて議論しましょう.

動力学の基礎を理解する


動的プロパティを定義するには、DynamicPropertyプロトコルにプロパティラッパーを実装するのと同じくらい簡単です.このプロトコルの唯一の要件でさえ、あなたのビューがいつでもその呼び出しを評価する方法を実装することです.プロパティラッパーを定義する方法の例を次に示します.
@proprtyWrapper
Struct MyPropertyWrapper: DynamicProperty {
  Var Wrappedvalue: String

Func update() {
// called whenever the view will evaluate its body
}
}
もちろん、この例はそれ自体で役に立ちません.すぐに、よりカスタムのプロパティラッパーを紹介します.我々が今まで定義してきたことを見直すためにちょっと時間を割ろう.
我々はかなり基本的なプロパティラッパーを定義しました.さらに、このラッパーのラップされた値は文字列です.そして、それは我々のSwiftuiビューでストリングとして使われることを意味します.
しかし、このポストでは、プロパティラッパーをクラスとして定義しました.おそらく、DynamicProperRTYラッパーをクラスとして定義することも許可されています.私が私の経験について話すならば、それは働きさえしないかもしれない非常に矛盾しない結果を届けます.したがって、Swift UIがクラスとして表されるプロパティラッパーを中断する理由は、あまり保証されません.
Swiftuiは、ボディーが評価しようとしているときはいつでも呼び出される更新メソッドを持っています.この関数を使用して、プロパティラッパーの外部に存在する状態を更新できます.お使いのプロパティラッパーでより複雑な作業をしていない限り、おそらくこの関数を実装する必要はありません.

ビューの更新をトリガーする動的プロパティの使用


独自に、動的なプロパティを更新するSwiftUIビューを通知することはできません.しかしながら、@ state、@ ObjecveDoObject、@ stateObject、および他のSwiftuiプロパティラッパーを利用して、カスタム状態ラッパー内で@ state、@ ObjecveDoObject、@ stateObject、および他のSwiftuiプロパティラッパーを使用してビューの更新をトリガーすることができます.
次のようになります.
@proprtyWrapper
Struct Custom Property: DynamicProperty {
  @State private var value = 0
Var Wrappedvalue: Int {
Get {
Return value
}
Nonmutating set {
Value - newValue
             }
         }
}
intプロパティは、このプロパティラッパーでラップされます.この値が新しい値を受け取るたびに@ stateプロパティ値が変更されます.このプロパティラッパーをビューで使用する方法の例を次に示します
Struct ContentView: View {
@CustomProperty var customProperty 

Var body: some View{
Text(“Count:\(customProperty)”)

Button (“Increment”) {
cutomProperty +=1

               }
       }
}
ボタンがクリックされると、CustomPropertyの値がSwiftUIビューで更新されます.したがって、これは自分で体の再評価をトリガーしません.しかし、私たちの包装されたアイテムを表す値は@状態でマークされます.これについて最も良いことは、どんな理由でも値が変わるときはいつでも、我々の見解が更新するということです.
このようなプロパティラッパーは実用的ではありませんが、様々な種類のデータアクセスの周りにかなりクールな抽象化を作成するために使用できます.たとえば、AppStorageのキーパスベースのバージョンを提供するユーザーdefaults抽象化を作成します.
class SettingKeys: ObservableObject {
@AppStorage ("onboardingCompleted™) var onboardingCompleted = false
@AppStorage ("promptedForProVersion") var promptedForProVersion = false
}

@propertyWrapper
struct Setting<T>: DynamicProperty {
@StateObject private var keys = SettingKeys()
private let key: ReferenceWritableKeyPath‹SettingKeys,T>
var wrappedValue: T{
get {
keys keyPath: key]
}
nonmutating set {
keys[keyPath: key] = newValue
    }
}
init(_ key: ReferenceWritableKeyPath‹SettingKeys, T>) {
Self.key = key 
     }
}
このプロパティを使用すると、次のようになります.
struct ContentView: View {
@Setting(\-onboardingCompleted) var didonboard
var body: some View {
Text("Onboarding completed: \ (didOnboard ? "Yes" : "No"') "')

Button("Complete onboarding"){
didonboard = true
          }
      }
}
@設定を使用するアプリケーション内の任意の場所(onboardingCompleted)var didonboard自動的に更新されるユーザーのデフォルトで完了したときに更新されたユーザーのデフォルトは、関係なく、ここで/どのように起こった.したがって、@ appstorageはどのように動作するかと同じです.実際、私のカスタムプロパティラッパーは、フードの下で@ appstorageに大きく頼ります.
私のSettingsKeysオブジェクトには、私が書きたいuserdefaultsの個々のキーがあります.そして、@ appstorageプロパティラッパーは簡単な観察を提供します、そして、どんな問題もなしでSettingskeysをObjectObjectとして指定させます.
ユーザーのデフォルト値から簡単に値を読むことができます.また、設定値の設定値にカスタム取得および設定を行うことにより、SettingsKeyの適切なキーパスに割り当てることで新しい値を作成できます.
このような単純なプロパティラッパーは、いくつかのデータアクセスを迅速にしたい場合や、いくつかの意味的な意味を与えたり、発見しやすくするために便利です.

プロパティラッパーでSwiftTui環境値を使用します。


Swiftuiのプロパティラッパーの一部を使用してビューの更新をトリガーすることに加えて、プロパティラッパーを使用するビューのSwiftUI環境にアクセスできます.しかし、あなたのプロパティラッパーがより複雑で、マネージオブジェクトコンテキスト、ネットワーキングオブジェクト、または他の類似したオブジェクトのようなものに依存するなら、それは特に有益です.
SwiftUI環境は、ビューで実行するのと同じ方法で、プロパティラッパー内からアクセスできます.
@propertyWrapper
struct CustomFetcher<T>: DynamicProperty {

@Environment (\.managedobjectContext) var managedobjectContext


// …
}
また、使用することもできます.ビューによって割り当てられた環境オブジェクトを読み込む環境変数View
@propertyWrapper
struct  UsesEnvironmentObject<T: ObservableObject›: DynamicProperty {
@Environmentobject  var envObject:T

// …

}
さらに、より便利な方法で環境を介してプロパティラッパーに依存性を渡すことができます.インターネットからデータを取得するプロパティラッパーを作成していることを想像してみましょう.ネットワークコールを必要とするデータを取得できるネットワークオブジェクトを持つことができます.このラッパーをプロパティラッパーに注入するには、環境を使用できます.
@propertyWrapper
struct FeedLoader‹Feed: FeedType›: DynamicProperty {
@Environment (\.network) var network
var wrappedvalue: [Feed.ObjectType] = []
}
私はカスタムキーとして私のSwifTui環境にネットワーク環境キーを追加しました.我々は、このプロパティラッパーを定義した今我々のラップ値を更新するためにネットワークからデータを収集し、何かに割り当てる手段を必要とします.これを行うには、hire iOS developerを使用することができます.この更新方法では、必要に応じてプロパティラッパー参照をデータに更新できます.

総括する


我々は今日の記事でいくつかの有用なプロパティラッパーについて議論し、それらが構成可能性とテスト容易性の点でどのように制限されるかを観察した.また、値を発行し、抽象記憶に格納する複合ユースケースに対処するには、カスタムプロパティラッパーを作成しました.