2010-08-20 18 views
9

Sto cercando una classe in Objective C simile a KeyValuePair di C# (anche senza i generici). Solo tutto ciò che ha un primo/secondo oggetto. Posso creare il mio senza alcun problema, ma capisco se uno è già lì, quindi non c'è bisogno di reinventare la ruota. Non ho avuto fortuna trovandone uno io ... Qualcuno ne conosce uno?Obiettivo C - Classe KeyValuePair?

risposta

11

Quindi fondamentalmente come una mappa di hash, giusto?

Use NSMutableDictionary

Esempio da 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

In questo modo, ma solo una singola istanza (hashmap/dizionario contiene più chiavi/valori). Sto cercando una classe che sia solo una singola chiave/valore. – Kyle

+3

Si potrebbe prendere in considerazione solo la creazione della propria classe "coppia". In alternativa, è possibile sottoclasse NSMutableDictionary e applicare una regola di una sola coppia di oggetti nel dizionario sottoclasse alla volta. Sembra strano che non ci sia un qualche tipo di oggetto "NSPair" standard ... – PixelCloudSt

1

Cosa succede ad usare le strutture semplici C? È "più veloce" rispetto alla scrittura di un'intera classe.

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

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

cose da tenere a mente:

  • Structs sono passati per valore.
  • ARC impedisce l'utilizzo di oggetti ObjC con le strutture ma i primitivi C sono ancora supportati.
  • Non è possibile aggiungere strutture alle classi di raccolta ObjC (NSArray, NSDictionary, ecc.).
+0

Sfortunatamente C struct non funziona bene con ARC e non puoi metterli in NSArray/NSDictionary e in molti altri posti. è quasi inutile –

+0

@BryanChen true, ma se hai bisogno di una sorta di contenitore da passare senza dover creare e tutta la classe, le strutture possono comunque essere utili. ARC impedisce l'utilizzo di oggetti ObjC con le strutture ma i primitivi C sono ancora supportati. –

+1

lo stai effettivamente facendo in modo più C/C++ invece di ObjC way. –

3

Che ne dici di un semplice NSArray?

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

Si potrebbe fare una funzione per avvolgere +arrayWithObjects: (e gestire il caso di una chiave nullo o di valore che potrebbero inciampare l'approccio semplice)

Accesso agli elementi di un NSArray sarà probabilmente più veloce di un NSDictionary.