2010-08-20 27 views
9

Estoy buscando una clase en Objective C similar a KeyValuePair de C# (incluso sin los genéricos). Cualquier cosa que tenga un primer/segundo objeto. Puedo crear el mío sin ningún problema, pero creo que si uno ya está allí, entonces no hay necesidad de reinventar la rueda. No he tenido suerte para encontrar uno ... ¿Alguien sabe de uno?Objetivo C - Clase KeyValuePair?

Respuesta

11

Así que básicamente como un hashmap, ¿verdad?

Use NSMutableDictionary

Ejemplo de here:

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; 

// Add objects to a dictionary indexed by keys 

[dictionary setObject:@"A Book about the Letter A" forKey:@"A"]; 
[dictionary setObject:@"A Book about the Letter B" forKey:@"B"]; 
[dictionary setObject:@"A Book about the Letter C" forKey:@"C"]; 

// Retrieve an object from a dictionary with a key 

NSLog([dictionary objectForKey:@"B"]); 

// Release a dictionary 

[dictionary release]; 
+8

Me gusta esto, pero solo una instancia (hashmap/dictionary contiene varias claves/valores). Estoy buscando una clase que sea solo una clave/valor. – Kyle

+3

Puede considerar la creación de su propia clase de "par". Alternativamente, podría subclase NSMutableDictionary y aplicar una regla de solo un par de objetos en su diccionario subclasificado a la vez. Parece extraño que no exista algún tipo de objeto "NSPair" estándar ... – PixelCloudSt

1

¿Qué pasa con el uso de estructuras de civil C? Es "más rápido" que escribir una clase completa.

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

//init like this 
KeyValuePair kvp = {"yourkey", "yourvalue"} 

cosas a tener en cuenta:

  • Las estructuras se pasan por valor.
  • ARC evita el uso de objetos ObjC con estructuras pero las primitivas C aún son compatibles.
  • No puede agregar estructuras a las clases de colección ObjC (NSArray, NSDictionary, etc.).
+0

Desafortunadamente C struct no funciona bien con ARC y no se puede poner en NSArray/NSDictionary y en muchos otros lugares. es casi inútil –

+0

@BryanChen cierto, pero si necesita algún tipo de contenedor para pasar sin tener que crear una clase completa, las estructuras pueden seguir siendo útiles. ARC evita el uso de objetos ObjC con estructuras, pero las primitivas C aún son compatibles. –

+1

en realidad lo está haciendo en más forma C/C++ en lugar de forma ObjC. –

3

¿Qué tal 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]; 

Se podría hacer una función para envolver +arrayWithObjects: (y manejar el caso de una clave nula o valor que pudieran tropezar con el enfoque simple)

Acceso a los elementos de un NSArray será probablemente más rápido que una NSDiccionario.