2012-10-31 10 views
5

Sto utilizzando NSMapTable in un numero di punti in un progetto iOS 6 e vorrei poter utilizzare il nuovo stile di indicizzazione del dizionario per l'accesso agli oggetti. (NSMapTable si comporta in gran parte come un NSMutableDictionary, ma può essere configurato con varie opzioni di gestione della memoria per le chiavi e valori che esso memorizza più di fondo in this StackOverflow question..)Sintassi di sottoscrizione per NSMapTable in iOS 6

Le relazioni compilatore questo quando si tenta di utilizzare l'indicizzazione di sintassi su una NSMapTable esempio:

Metodo previsto per la lettura dell'elemento del dizionario non trovato sull'oggetto di tipo 'NSMapTable *'.

Come posso usare una categoria per estendere NSMapTable per consentire alla nuova NSDictionary subscripting in stile?

risposta

4

La risposta è in realtà semplice; vedere this question per ulteriori informazioni su come implementare l'indicizzazione. Aggiungi una categoria come questa.

Intestazione:

@interface NSMapTable (Subscripting) 

- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key; 
- (id)objectForKeyedSubscript:(id)key; 

@end 

Implementazione:

@implementation NSMapTable (Subscripting) 

- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key { 
    [self setObject:obj forKey:key]; 
} 

- (id)objectForKeyedSubscript:(id)key { 
    return [self objectForKey:key]; 
} 

@end 

Questo mi fa chiedere, per un momento, se l'accesso indice è in realtà un pochino più lento rispetto l'alternativa in alcuni o tutti i casi, ma le parole "ottimizzazione prematura" rendono questo pensiero irrilevante.

+1

IMO, questa non è una buona idea. 'NSMapTable' non ha sottoscrizioni per un motivo. Ad esempio, se hai un 'NSMapTable' usando' NSPointerFunctionsStrongMemory', perché dovresti conformarti a 'NSCopying'? Questa categoria storpia effettivamente 'NSMapTable' in una raccolta di tipo dizionario. –

+0

@RudolfAdamkovic è possibile evitare l'uso di 'NSCopying' nelle dichiarazioni dei metodi di abbonamento. – k06a

2

Migliorata risposta @mjh con il comportamento NSDictionary s' sull'impostazione oggetto per nil chiave e ha aggiunto Obj-C Generics:

@interface NSMapTable<KeyType, ObjectType> (Subscripting) 

- (void)setObject:(ObjectType)obj forKeyedSubscript:(KeyType)key; 
- (ObjectType)objectForKeyedSubscript:(KeyType)key; 

@end 

@implementation NSMapTable (Subscripting) 

- (void)setObject:(id)obj forKeyedSubscript:(id)key { 
    if (object) { 
     [self setObject:obj forKey:key]; 
    } else { 
     [self removeObjectForKey:key]; 
    } 
} 

- (id)objectForKeyedSubscript:(id)key { 
    return [self objectForKey:key]; 
} 

@end