) } // Subscribe to the publisher

ご覧のとおり、ラップされたプロパティにアクセスするためにメッセージを使用し、パブリッシャーにアクセスするために$ messageを使用します。ラッパーに投影値を追加するにはどうすればよいですか?特別なことは何もありません。宣言するだけです。

@propertyWrapper struct Published { private let subject = PassthroughSubject() var wrappedValue: Value { didSet { subject.send(wrappedValue) } } var projectedValue: AnyPublisher { subject.eraseToAnyPublisher() } }

前述のように、projectedValueプロパティは、ニーズに基づいて任意のタイプにすることができます。

制限事項

新しいプロパティラッパーの構文は見栄えがしますが、いくつかの制限もあります。主な制限は次のとおりです。

  1. エラー処理に参加することはできません。ラップされた値はプロパティ(メソッドではない)であり、ゲッターまたはセッターをthrowsとしてマークすることはできません。たとえば、Emailではたとえば、ユーザーが無効な電子メールを設定しようとした場合にエラーをスローすることはできません。 nilを返すことができますまたはfatalError()でアプリをクラッシュさせます場合によっては受け入れられない可能性があります。
  2. プロパティに複数のラッパーを適用することは許可されていません。たとえば、別の@CaseInsensitiveがある方がよいでしょう。ラッパーを作成し、@Emailと組み合わせます@Emailを作成する代わりにラッパー大文字と小文字を区別しません。ただし、このような構造は禁止されており、コンパイルエラーが発生します。
@CaseInsensitive @Email var email: String?

この特定のケースの回避策として、Emailを継承できます。 CaseInsensitiveからのラッパーラッパー。ただし、継承にも制限があります。継承をサポートするのはクラスのみであり、許可される基本クラスは1つだけです。

結論

@propertyWrapperアノテーションはプロパティラッパーの構文を単純化し、通常のプロパティと同じようにラップされたプロパティを操作できます。これにより、コードが Swift開発者 よりコンパクトでわかりやすい。同時に、考慮しなければならないいくつかの制限があります。それらのいくつかが将来のSwiftバージョンで修正されることを願っています。

Swiftのプロパティについて詳しく知りたい場合は、 公式ドキュメント

基本を理解する

Swiftのプロパティラッパーとは何ですか?

プロパティラッパーは、プロパティへの読み取りおよび書き込みアクセスをカプセル化し、プロパティに追加の動作を追加する汎用構造です。

なぜプロパティラッパーが必要なのですか?

使用可能なプロパティ値を制限したり、読み取り/書き込みアクセスを変更したり(DBやその他のストレージを使用するなど)、値の検証などのメソッドを追加する必要がある場合は、プロパティラッパーを使用します。

Swiftのどのバージョンに@propertyWrapperアノテーションが含まれていますか?

@propertyWrapperアノテーションは、Swift5.1以降で使用できます。

ラッパーにはどのような制限がありますか?

エラー処理に参加することはできず、プロパティに複数のラッパーを適用することは許可されていません。