2 votes

Comment puis-je passer une propriété d'une classe comme paramètre d'une méthode en Objective-C ?

Comment puis-je passer une propriété d'une classe comme paramètre d'une méthode dans objective-c ?

Donc, à titre d'exemple, supposons que j'ai :

  • une classe d'objets gérés CoreData, MyData, avec des propriétés dynamiques PropA, PropB, PropC, toutes du même type.
  • J'ai une méthode utilitaire qui effectue des calculs et met à jour l'une de ces propriétés, en prenant comme entrée l'instance MyData.
  • comment faire pour que la méthode utils puisse accepter une indication de la propriété à utiliser dans les calculs et la mise à jour ? (par exemple PropB)

Alors, il faut :

  1. Un moyen de transmettre une indication de la propriété à la méthode (par exemple, envoyer comme String ?)
  2. Un moyen dans la méthode de prendre ceci (de 1 ci-dessus) et de l'utiliser à la fois pour (a) accéder à la valeur de cette propriété dans l'instance MyData que la méthode a, PLUS (b) mettre à jour la propriété aussi.

4voto

Toro Points 4827

Une propriété aura une méthode setter et getter. Dans votre cas, je suppose qu'il y a setPropA, setPropB, setPropC pour les setters et PropA, PropB, PropC pour les getters.

Puis je passe la chaîne "PropA" à l'util, indiquant que je veux accéder à la propriété nommée PropA. L'util peut obtenir la valeur par

id val = [aObj performSelector:NSSelectorFromString(@"PropA")];

Et définir la propriété par

[aObj performSelector:NSSelectorFromString(@"SetPropA") withObject:newValue];

Ou, vous pouvez passer le setter et le getter comme paramètre par NSStringFromSelector() transforme le sélecteur en une NSString. Par exemple, je passe setter et getter par NSDictionary.

NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
                          NSStringFromSelector(@selector(setPropA:)), kSetterKey,
                          NSStringFromSelector(@selector(PropA)), kGetterKey, nil];

// inside myUtil
NSString *setter = [userInfo objectForKey:kSetterKey];
[aObj performSelector:NSSelectorFromString(setter) withObject:newValue];
NSString *getter = [userInfo objectForKey:kGetterKey];
id val = [aObj performSelector:NSSelectorFromString(getter)];

J'espère que cela vous aidera.

2voto

Jörn Eyrich Points 1256

Oui, vous pouvez transmettre le nom de la propriété sous forme de chaîne.

Vous pouvez alors accéder à la propriété indiquée via le Key-Value Coding : http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/KeyValueCoding.html

Exemple :

- (void) myUtilMethod: (MyData *) myData
     forPropertyNamed: (NSString *) propName /* which property to operate on (1) */
{
   id oldValue = [ myData valueForKey: propName]; // get value (2a)

   id newValue = ...; // your calculation here

   [myData setValue: newValue forKey: propName]; // set value (2b)
}

0voto

Rabskatran Points 923

Je ne lierai pas les 2 classes directement. Vous devriez mettre en place un modèle de conception qui vous permette de les coupler de manière lâche en créant une classe qui fera l'interface entre les deux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X