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? P>
4 Réponses :
Donc, fondamentalement comme un hashmap, non?
Exemple de ici : p>
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" ...
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"}
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.
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];
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 code>. Pour Nsdictionary, il serait (je crois) doit être
[[Thing AllKeys] FirstObject] CODE> NSDictionary est une Collection i> de paires de la valeur clé; Cela ne fait pas une paire de valeur clé.
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 Tout d'abord, vous pouvez utiliser les em> obj-c littéraux em> pour créer une paire de valeurs de clé, comme: p> 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> et profiter de la bonté cachée de l'objectif-c.
Nsdictionary code> à cause des clusters de la classe Obj-C forts>. Voici un extrait de mon debugger Xcode: P>
po [@{@"Motti":@YES} class]
__NSSingleEntryDictionaryI