) } // Subscribe to the publisher

Comme vous pouvez le voir, nous utilisons un message pour accéder à la propriété encapsulée et un message $ pour accéder à l'éditeur. Que devez-vous faire pour ajouter une valeur projetée à votre wrapper? Rien de spécial, il suffit de le déclarer.

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

Comme indiqué précédemment, le projectedValue propriété peut avoir n'importe quel type en fonction de vos besoins.

Limites

La syntaxe des nouveaux wrappers de propriétés semble bonne, mais elle contient également plusieurs limitations, les principales étant:

  1. Ils ne peuvent pas participer à la gestion des erreurs. La valeur encapsulée est une propriété (pas une méthode), et nous ne pouvons pas marquer le getter ou le setter comme throws. Par exemple, dans notre Email Par exemple, il n'est pas possible de générer une erreur si un utilisateur tente de définir un e-mail non valide. Nous pouvons retourner nil ou plantez l'application avec un fatalError() appel, ce qui pourrait être inacceptable dans certains cas.
  2. L'application de plusieurs wrappers à la propriété n'est pas autorisée. Par exemple, il serait préférable d'avoir un @CaseInsensitive wrapper et combinez-le avec un @Email wrapper au lieu de créer le @Email emballage insensible à la casse. Mais de telles constructions sont interdites et conduisent à des erreurs de compilation.
@CaseInsensitive @Email var email: String?

Pour contourner ce cas particulier, nous pouvons hériter de Email wrapper du CaseInsensitive wrapper. Cependant, l'héritage a également des limitations: seules les classes prennent en charge l'héritage et une seule classe de base est autorisée.

Conclusion

@propertyWrapper les annotations simplifient la syntaxe des encapsuleurs de propriétés et nous pouvons opérer avec les propriétés encapsulées de la même manière qu'avec les propriétés ordinaires. Cela rend votre code, en tant que Développeur Swift plus compact et compréhensible. En même temps, il présente plusieurs limites dont nous devons tenir compte. J'espère que certains d'entre eux seront rectifiés dans les futures versions de Swift.

Si vous souhaitez en savoir plus sur les propriétés Swift, consultez les documents officiels .

Comprendre les bases

Qu'est-ce qu'un wrapper de propriété dans Swift?

Un wrapper de propriété est une structure générique qui encapsule l'accès en lecture et en écriture à la propriété et lui ajoute un comportement supplémentaire.

Pourquoi avons-nous besoin de wrappers de propriété?

Nous utilisons des wrappers de propriété si nous avons besoin de contraindre les valeurs de propriété disponibles, de modifier l'accès en lecture / écriture (comme l'utilisation de la base de données ou d'un autre stockage) ou d'ajouter des méthodes supplémentaires telles que la validation de valeur.

Quelle version de Swift contient l'annotation @propertyWrapper?

L'annotation @propertyWrapper est disponible dans Swift 5.1 ou version ultérieure.

Quelles sont les limites du wrapper?

Ils ne peuvent pas participer à la gestion des erreurs et l'application de plusieurs wrappers à la propriété n'est pas autorisée.