7
votes

Objective-C: Quelle est la différence entre ForeKey et ForkeyPathe?

Quelle est la différence entre ForeKey et ForkeyPath dans la méthode SETValue de NSMutAfitionnelle? J'ai regardé tous les deux dans la documentation et ils me semblaient la même chose. J'ai essayé de suivre le code, mais je ne pouvais pas distinguer la différence. XXX


1 commentaires

Seulement différent si vous utilisez un dictionnaire plus complexe (avec plusieurs niveaux). La raison pour laquelle vous ressemble la même chose est qu'un clavier avec une seule chose (non . indiquant un composant de chemin supplémentaire) est en réalité une clé.


3 Réponses :


3
votes

Apple Documentation: NskeyValuecoding Protocol Référence

SETVALUE: FORKEKE: FORT> P>

Définit la propriété du récepteur spécifié par une clé donnée sur une valeur donnée. P>

Exemple: em> p> xxx pré>

SETValue: ForKeyPathe: strong> p>

Définit la valeur de la propriété identifiée par un chemin de clé donné à une valeur donnée. p>

Exemple: em> p>

[foo setValue:@"The quick brown fox" forKeyPath:@"bar.stringOnBar"];


1 commentaires

En outre, lorsque vous utilisez "SETVALUE: ForKeyPathe:" Assurez-vous que l'objet au clavier existe. Si c'est nul, la méthode échouera silencieusement car le chemin est incomplet.



8
votes

Les deux méthodes font partie de Codage de valeur et ne doit généralement pas être utilisé pour l'accès des éléments dans les dictionnaires. Ils ne fonctionnent que sur des clés de type nstring et nécessitent une syntaxe spécifique.

La différence entre les deux est que la spécification d'une clé (unique) ne pouvait que regarder cet élément.

Spécification d'un chemin de clé de l'autre main suit le chemin à travers les objets. Si vous aviez un dictionnaire de dictionnaires, vous pouvez rechercher un élément du deuxième niveau en utilisant un chemin de clé comme "key1.key2" . .

Si vous voulez simplement accéder à des éléments dans un dictionnaire, vous devez utiliser objetforkey: et setObject: Forey: . .

edit pour répondre à la raison pour laquelle ValueForKekey: ne doit pas être utilisé:

  1. ValueForKey: fonctionne uniquement pour les clés de chaîne. Les dictionnaires peuvent utiliser d'autres objets pour les touches.
  2. ValueForKeKey: Poignez les touches qui commencent par un caractère "@" différemment. Vous ne pouvez pas accéder aux éléments dont les touches commencent par @ .
  3. Plus important encore: En utilisant ValueForKekey: Vous dites: "J'utilise kvc". Il devrait y avoir une raison de faire cela. Lorsque vous utilisez ObjectForKey: Vous obtenez simplement des éléments dans un dictionnaire via l'API naturelle et prévue.

1 commentaires

Juste hors de curiosité, quelle est la raison pour laquelle ValueForKey: ne doit pas être utilisé avec des dictionnaires?



0
votes

Le clavier peut être utilisé pour traverser les chemins d'objets arbitraires, tant qu'ils implémentent nskeyvaluecoding . Ils n'ont pas besoin d'être Nsdicdiction s. Par exemple: xxx

Bien qu'il s'agisse d'un autre exemple artificiel.


0 commentaires