9
votes

Objectif C - Classe KeyValuePair?

Je recherche une classe d'objectif C similaire à c # 's keyvaluepair (même sans génériques). Juste tout ce qui a un premier / deuxième objet. Je peux créer le mien sans problème, mais je pense que si on y est déjà là, il n'est pas nécessaire de réinventer la roue. Je n'ai pas eu de chance que quelqu'un me donne moi-même ... Est-ce que quelqu'un en connaît-il d'un?


0 commentaires

4 Réponses :


11
votes

Donc, fondamentalement comme un hashmap, non?

Utilisez Nsmutmédictionnel

Exemple de ici : xxx


2 commentaires

Comme ceci, mais seulement une seule instance (hashmap / dictionnaire contient plusieurs clés / valeurs). Je cherche une classe qui est juste une seule clé / valeur.


Vous pourriez envisager de créer votre propre classe "paire". Vous pouvez également subordonner la sous-classe Nsmutabledictionner et appliquer une règle d'une seule paire d'objets dans votre dictionnaire sous-classé à la fois. Il semble étrange qu'il n'y ait pas une sorte d'objet standard "nspair" ...



2
votes

Qu'en est-il de l'utilisation des structures CLAIR C? C'est "plus rapide" que d'écrire une classe entière.

typedef struct KeyValuePair {
     const char *key;
     const char *value;
} KeyValuePair;

//init like this
KeyValuePair kvp = {"yourkey", "yourvalue"}
  • Les structures sont transmises par la valeur. LI>
  • Arc empêche l'utilisation d'objets Objc avec des structures, mais des primitives C sont toujours prises en charge. li>
  • Vous ne pouvez pas ajouter de la structure aux classes de collection Objc (NSARRAY, NSDictionary, etc.). LI> ul> p>


3 commentaires

Malheureusement, C struct ne fonctionne pas bien avec l'ARC et vous ne pouvez pas les mettre dans NSARRAY / NSDICDICTIONNAIRE et de nombreux autres endroits. C'est presque inutile


@ Bryanchen True, mais si vous aviez besoin d'une sorte de conteneur pour transmettre sans avoir à créer et que la classe complète, les structures peuvent toujours être utiles. Arc empêche d'utiliser des objets Objc avec des structures, mais des primitives C sont toujours prises en charge.


Vous le faites en plus de manière C / C ++ au lieu de OBJC Way.



5
votes

Que diriez-vous d'un simple nsarray?

NSArray* kvp = [NSArray arrayWithObjects: key, value, nil];
// or, using boxed literals,
NSArray* kvp = @[key, value];
...
NSObject* key = [kvp firstObject];
NSObject* value = [kvp lastObject];


4 commentaires

La sémantique de Nsarray ne supporte pas la notion de «clé» ou de «valeur». Vous surchargez les définitions avec quelque chose que vous connaissez uniquement comme programmeur, ce qui n'est pas aussi agréable. Il y a cependant une autre classe ... qui soutient cette notion et sert encore mieux avec ses littéraux et dans sa performance. Voir ma réponse ci-dessous.


Je prends ton point mais Kyle a demandé "juste tout ce qui a un premier ou deuxième objet". Un dictionnaire n'a pas la même sémantique qu'une paire de valeur clé, donc son efficacité ou non n'est pas pertinente


S'il vous plaît voir ma réponse complète, car Nsdictionary prend en charge la sémantique et les performances de la paire de mots-clés, à l'aide d'un «cluster de classe» avec une sous-classe spécifique de NSDictionary (__nssingleentrictionRictionaryI) auto-créée à chaque fois qu'un dictionnaire à paire est nécessaire.


J'ai vu votre réponse complète et plus important encore, j'ai vu la question, où Kyle demande quelque chose comme .net's KeyValuePair . Cette classe simple n'a que deux propriétés d'intérêt - clé et valeur, à utiliser comme truc.key . Pour Nsdictionary, il serait (je crois) doit être [[Thing AllKeys] FirstObject] NSDictionary est une Collection de paires de la valeur clé; Cela ne fait pas une paire de valeur clé.



0
votes

Votre meilleur abattage de la définition de votre propre objet modèle contenant vos propriétés "Key" et "Value", consiste à utiliser un ancien NSDictionary code> et profiter de la bonté cachée de l'objectif-c.

Tout d'abord, vous pouvez utiliser les em> obj-c littéraux em> pour créer une paire de valeurs de clé, comme: p> xxx pré>

ou, avec des constantes: @ {@ "motti", @yes}; code> p>

Il s'agit d'une référence d'instance Obj-C que vous pouvez utiliser partout. p>

cependant ... Le vrai régal ici est que vous ne perdez pas la performance en employant Nsdictionary code> à cause des clusters de la classe Obj-C forts>. Voici un extrait de mon debugger Xcode: P>

 po [@{@"Motti":@YES} class]
__NSSingleEntryDictionaryI


0 commentaires