Si tel est le cas, existe-t-il des différences clés qui n'étaient pas présentes lors de l'utilisation de l'observation clé-valeur dans Objective-C?
swift
key-value-observing
codeperson
la source
la source
.initial
. Pour une solution, voir ici . Je recommande vivement de consulter les documents Apple . Il a été mis à jour récemment et couvre de nombreuses notes importantes. Voir aussi l' autre réponse deRéponses:
(Modifié pour ajouter de nouvelles informations): considérez si l'utilisation du framework Combine peut vous aider à accomplir ce que vous vouliez, plutôt que d'utiliser KVO
Oui et non. KVO fonctionne sur les sous-classes NSObject comme il l'a toujours fait. Cela ne fonctionne pas pour les classes qui ne sous-classent pas NSObject. Swift n'a pas (du moins actuellement) son propre système d'observation natif.
(Voir les commentaires pour savoir comment exposer d'autres propriétés en tant qu'ObjC afin que KVO fonctionne dessus)
Consultez la documentation Apple pour un exemple complet.
la source
dynamic
mot - clé sur n'importe quelle classe Swift pour activer la prise en charge de KVO.dynamic
mot clé va sur la propriété que vous souhaitez rendre observable clé-valeur.dynamic
mot - clé peut être trouvée dans la section Utilisation de Swift avec Cocoa et Objective-C de la bibliothèque des développeurs Apple .dynamic
mot - clé pour toutes les propriétés à l' intérieur d'une classe que vous aimeriez être compatible KVO (pas ledynamic
mot - clé sur la classe elle-même). Cela a fonctionné pour moi!Vous pouvez utiliser KVO dans Swift, mais uniquement pour les
dynamic
propriétés de laNSObject
sous - classe. Considérez que vous vouliez observer labar
propriété d'uneFoo
classe. Dans Swift 4, spécifiezbar
commedynamic
propriété dans votreNSObject
sous-classe:Vous pouvez ensuite vous inscrire pour observer les modifications apportées à la
bar
propriété. Dans Swift 4 et Swift 3.2, cela a été considérablement simplifié, comme indiqué dans Utilisation de l'observation des valeurs-clés dans Swift :Notez que dans Swift 4, nous avons maintenant un typage fort des chemins de clé à l'aide du caractère barre oblique inverse (
\.bar
c'est le chemin de clé pour labar
propriété de l'objet observé). De plus, comme il utilise le modèle de fermeture de complétion, nous n'avons pas à supprimer manuellement les observateurs (lorsque l'observateurtoken
tombe hors de portée, l'observateur est supprimé pour nous) ni à nous soucier d'appeler l'super
implémentation si la clé ne le fait pas rencontre. La fermeture est appelée uniquement lorsque cet observateur particulier est appelé. Pour plus d'informations, consultez la vidéo WWDC 2017, Nouveautés de Foundation .Dans Swift 3, pour observer cela, c'est un peu plus compliqué, mais très similaire à ce que l'on fait en Objective-C. À savoir, vous implémenteriez
observeValue(forKeyPath keyPath:, of object:, change:, context:)
ce qui (a) garantit que nous traitons avec notre contexte (et non quelque chose que notresuper
instance avait enregistré pour observer); puis (b) soit le manipuler, soit le transmettre à l'super
implémentation, si nécessaire. Et assurez-vous de vous retirer en tant qu'observateur le cas échéant. Par exemple, vous pouvez supprimer l'observateur lorsqu'il est désalloué:Dans Swift 3:
Notez que vous ne pouvez observer que les propriétés qui peuvent être représentées en Objective-C. Ainsi, vous ne pouvez pas observer les génériques, les
struct
types Swift, lesenum
types Swift , etc.Pour une discussion sur l'implémentation de Swift 2, voir ma réponse originale ci-dessous.
L'utilisation du
dynamic
mot - clé pour atteindre KVO avec desNSObject
sous-classes est décrite dans la section Observation des valeurs-clés du chapitre Adopting Cocoa Design Conventions du guide Utilisation de Swift avec Cocoa et Objective-C :[Notez que cette discussion KVO a par la suite été supprimée du guide Utilisation de Swift avec Cocoa et Objective-C , qui a été adapté pour Swift 3, mais il fonctionne toujours comme indiqué en haut de cette réponse.]
Il convient de noter que Swift a son propre système d' observateur de propriétés natif , mais c'est pour une classe spécifiant son propre code qui sera exécuté après l'observation de ses propres propriétés. KVO, d'autre part, est conçu pour s'enregistrer pour observer les changements de certaines propriétés dynamiques d'une autre classe.
la source
myContext
et comment observez-vous plusieurs propriétés?context
pointeur. Lecontext
pointeur est fourni à l'observateur lorsqu'ilobserveValueForKeyPath:ofObject:change:context:
est appelé. Lecontext
pointeur peut être un pointeur C ou une référence d'objet. Lecontext
pointeur peut être utilisé comme identifiant unique pour déterminer le changement observé ou pour fournir d'autres données à l'observateur. "options
vide, cela signifie simplement que lechange
n'inclura pas l'ancienne ou la nouvelle valeur (par exemple, vous pourriez simplement obtenir la nouvelle valeur vous-même en référençant l'objet lui-même). Si vous spécifiez simplement.new
et non.old
, cela signifie quechange
cela n'inclura que la nouvelle valeur, mais pas l'ancienne valeur (par exemple, vous ne vous souciez souvent pas de ce qu'était l'ancienne valeur, mais uniquement de la nouvelle valeur). Si vous devez vousobserveValueForKeyPath
transmettre à la fois l'ancienne et la nouvelle valeur, spécifiez[.new, .old]
. En bout de ligne,options
spécifie simplement ce qui est inclus dans lechange
dictionnaire.Oui et non:
Oui , vous pouvez utiliser les mêmes anciennes API KVO dans Swift pour observer les objets Objective-C.
Vous pouvez également observer les
dynamic
propriétés des objets Swift héritant deNSObject
.Mais ... Non, ce n'est pas fortement typé comme vous pouvez vous attendre à ce que le système d'observation natif Swift le soit.
Utilisation de Swift avec Cocoa et Objective-C | Observation des valeurs clés
Non , il n'y a actuellement pas de système d'observation des valeurs intégré pour les objets Swift arbitraires.
Oui , il existe des observateurs de propriétés intégrés , qui sont fortement typés.
Mais ... Non, ils ne sont pas KVO, puisqu'ils permettent seulement d'observer les propriétés propres des objets, ne supportent pas les observations imbriquées ("chemins clés"), et vous devez les implémenter explicitement.
Le langage de programmation Swift | Observateurs immobiliers
Oui , vous pouvez implémenter l'observation de valeur explicite, qui sera fortement typée, et autoriser l'ajout de plusieurs gestionnaires à partir d'autres objets, et même prendre en charge l'imbrication / les "chemins de clé".
Mais ... Non, ce ne sera pas KVO car il ne fonctionnera que pour les propriétés que vous implémentez comme observables.
Vous pouvez trouver une bibliothèque pour implémenter une telle observation de valeur ici:
Observable-Swift - KVO pour Swift - Observation de valeur et événements
la source
Un exemple pourrait aider un peu ici. Si j'ai une instance
model
de classeModel
avec des attributsname
et questate
je peux observer ces attributs avec:Les modifications apportées à ces propriétés déclencheront un appel à:
la source
Oui.
KVO nécessite une répartition dynamique, il vous suffit donc d'ajouter le
dynamic
modificateur à une méthode, une propriété, un indice ou un initialiseur:dynamic var foo = 0
Le
dynamic
modificateur garantit que les références à la déclaration seront distribuées dynamiquement et accessibles viaobjc_msgSend
.la source
En plus de la réponse de Rob. Cette classe doit hériter de
NSObject
, et nous avons 3 façons de déclencher un changement de propriétéUtiliser à
setValue(value: AnyObject?, forKey key: String)
partir deNSKeyValueCoding
Utiliser
willChangeValueForKey
etdidChangeValueForKey
deNSKeyValueObserving
Utilisez
dynamic
. Voir la compatibilité des types SwiftEt la propriété getter et setter est appelée lorsqu'elle est utilisée. Vous pouvez vérifier lorsque vous travaillez avec KVO. Ceci est un exemple de propriété calculée
la source
Aperçu
Il est possible d'utiliser
Combine
sans utiliserNSObject
ouObjective-C
Disponibilité:
iOS 13.0+
,macOS 10.15+
,tvOS 13.0+
,watchOS 6.0+
,Mac Catalyst 13.0+
,Xcode 11.0+
Remarque: doit être utilisé uniquement avec des classes et non avec des types valeur.
Code:
Version Swift: 5.1.2
Production:
Référer:
la source
Actuellement, Swift ne prend en charge aucun mécanisme intégré pour observer les changements de propriété d'objets autres que «self», donc non, il ne prend pas en charge KVO.
Cependant, KVO est une partie tellement fondamentale d'Objective-C et de Cocoa qu'il semble fort probable qu'il sera ajouté à l'avenir. La documentation actuelle semble impliquer ceci:
Utilisation de Swift avec Cocoa et Objective-C
la source
Une chose importante à mentionner est qu'après la mise à jour de votre Xcode vers la version 7 beta, vous pourriez recevoir le message suivant: "La méthode ne remplace aucune méthode de sa superclasse" . C'est à cause du caractère facultatif des arguments. Assurez-vous que votre gestionnaire d'observation ressemble exactement à ce qui suit:
la source
Cela peut être utile à peu de gens -
J'avais utilisé KVO de cette manière dans Swift 3. Vous pouvez utiliser ce code avec quelques modifications.
la source
Un autre exemple pour quiconque rencontre un problème avec des types tels que Int? et CGFloat ?. Vous définissez simplement votre classe comme une sous-classe de NSObject et déclarez vos variables comme suit, par exemple:
la source