Swift 4 approche pour observeValue(forKeyPath:...)
J'ai essayé de trouver un exemple, mais ce que j'ai vu ne fonctionne pas dans mon cas.
Ce qui serait l'équivalent du code suivant:
object.addObserver(self, forKeyPath: "keyPath", options: [.new], context: nil)
override public func observeValue(
forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {
}
Le code ci-dessus fonctionne, mais j'obtiens un message d'avertissement de SwiftLink:
Préfèrent le nouveau bloc fonction KVO API avec keypaths lors de l'utilisation de Swift 3.2 ou une version ultérieure.
Je vous remercie si vous pouvez me diriger dans la bonne direction.
- Peut-être que ceci peut vous aider.
Vous devez vous connecter pour publier un commentaire.
Swift 4 introduit une famille de béton Clés-types de Tracé, une nouvelle Clé-Expression De Chemin D'Accès à les produire et à une nouvelle fermeture de la base de observer fonction disponible pour les classes qui en héritent
NSObject
.À l'aide de ce nouvel ensemble de fonctionnalités, votre exemple peut maintenant être exprimé beaucoup plus succinctement:
Les Types Impliqués
observation:
NSKeyValueObservation
change:
NSKeyValueObservedChange
\.keyPath
: Une instance d'un Chemin d'accès clé catégorie produits au moment de la compilation.Clé-Chemin de la grammaire
Le général la grammaire d'une Expression de Chemin suit la forme
\Type.keyPath
oùType
est un type concret nom (incl. tous les paramètres génériques), etkeyPath
une chaîne d'un ou de plusieurs propriétés, des indices, ou en option chaînage forcés/déballage postfixes. En outre, si le chemin d'accès clé de Type peut être déduit du contexte, il peut être gommés, résultant en une plus lapidaire\.keyPath
.Ce sont toutes valides-Clés Expressions de Chemin:
Propriété
Vous êtes le propriétaire de la
NSKeyValueObservation
exemple leobserve
fonction renvoie la, le sens, vous n'avez pas àaddObserver
niremoveObserver
plus; plutôt, vous gardez une référence forte à elle pour aussi longtemps que vous avez besoin de votre sens de l'observation l'observation.Vous êtes pas nécessaire pour
invalidate()
soit: ildeinit
gracieusement. Donc, vous pouvez la laisser vivre jusqu'à ce que l'instance tenue il meurt, l'arrêter manuellement parnil
ing la référence, ou même invoquerinvalidate()
si vous avez besoin de garder votre exemple vivant pour certains malodorante raison.Mises en garde
Comme vous l'avez remarqué, l'observation encore se cache à l'intérieur de l'enceinte de Cacao du KVO mécanisme, par conséquent, il est seulement disponible à l'Obj-C classes et rapide des classes héritant
NSObject
(chaque Swift-dev type préféré) avec l'ajout de l'exigence que toute la valeur que vous avez l'intention d'observer, doivent être marquées comme@objc
(chaque Swift-dev préférée de l'attribut) et a déclarédynamic
.Cela étant dit, l'ensemble du mécanisme est félicité de l'amélioration, en particulier parce qu'il parvient à Swiftify observation importés
NSObjects
de modules de nous peut arriver à être requis pour l'utilisation (par exemple.Foundation
), et sans risque d'affaiblissement de la puissance expressive nous travaillons si dur à obtenir avec chaque frappe de touche.Comme une note, Clé-Path String Expressions sont encore nécessaires pour accéder dynamiquement
NSObject
's propriétés à KVC ou appelezvalue(forKey(Path):)
Au-delà de KVO
Il y a beaucoup plus d'-Clés Expressions de Chemin que KVO.
\Type.path
expressions peuvent être stockées en tant queKeyPath
objets pour les réutiliser ultérieurement. Ils viennent dans l'écriture, partielle et le type effacé saveurs. Ils peuvent augmenter la puissance expressive de getter/setter fonctions conçues pour la composition, pour ne pas mentionner le rôle qu'ils jouent en permettant à ceux avec la plus forte de l'estomac pour se plonger dans le monde de concepts fonctionnels comme des Lentilles et des Prismes. Je vous suggère de vérifier les liens vers le bas ci-dessous pour en apprendre davantage sur les nombreuses de développement portes, ils peuvent ouvrir.Liens:
Clé-Chemin Expression @ docs.swift.org
KVO docs @ Apple
Swift Évolution Smart KeyPaths proposition
Ole Begemann du Whats-new-in-Swift-4 aire de jeux avec les Principaux exemples de Chemin
La WWDC 2017 Vidéo: nouveautés de la Fondation 4:35 pour SKP et 19:40 pour le KVO.
D'ajouter quelque chose à la réponse que j'ai vécu s'écrase sur mon application lors de l'utilisation de cette méthode dans iOS 10.
Dans iOS 10, vous avez encore besoin de supprimer l'observateur avant de la désallocation de la classe ou sinon vous obtiendrez un crash
NSInternalInconsistencyException
en déclarant que:Pour éviter ce plantage. Réglez simplement l'observateur de la propriété que vous utilisez pour
nil
.