2011-01-25 11 views
12

Estoy intentando implementar una subclase de NSMutableDictionary que devuelve nil en lugar de arrojar una NSUndefinedKeyException cuando la clave no está presente en el Diccionario.Subclase NSMutableDictionary

Sin embargo, cuando intento agregar objetos a mi diccionario Puedo obtener

[NSMutableDictionary setObject:forKey:]: method only defined for abstract class 

NilDictionary.h

@interface NilDictionary : NSMutableDictionary { 
} 
@end 

NilDctionary.m

@implementation NilDictionary 
- (id)valueForUndefinedKey:(NSString *)key { 
    return nil; 
} 
@end 

es lo que realmente tiene que poner en práctica todos los métodos de NSMutableDictionary otra vez en mi subclase o hay alguna otra clase que debería ser subclas ¿canta?

aclaración: Mi problema original fue que no pude leer la documentación correctamente.

Si necesita la subclase NSMutableDictionary, busque la respuesta correcta. Si quiere un diccionario que devuelve nada cuando su clave no está presente, NSMutableDictionary ya lo hace.

+1

¿Qué haces exactamente con un diccionario para que arroje una 'NSUndefinedKeyException'? Intentar acceder a una clave no válida en un diccionario automáticamente devuelve 'nil' de todos modos; ¿Cómo estás obteniendo este error? –

Respuesta

25

NSMutableDictionary Class Reference dice:

En una subclase, debe reemplazar tanto a los métodos primitivos:

1. setObject: forKey:
2. removeObjectForKey:

Debe también anula los métodos primitivos de la clase NSDictionary.


NSDictionary Class Reference dice:

Si necesita subclase NSDictionary, es necesario tener en cuenta que está representado por un Class cluster -hay por lo tanto, varios métodos primitivos en que se basan los métodos conceptualmente:

1. recuento
2. objectForKey:
3. keyEnumerator
4. initWithObjects: forKeys: Count:

En una subclase, que deben prevalecer todos estos métodos.

NSDictionary’s otros métodos funcionan invocando una o más de estas primitivas. Los métodos no primitivos proporcionan formas convenientes de acceder a múltiples entradas a la vez.


Parece que es necesario anulación de todos estos seis métodos para hacer su trabajo NSMutableDictionary subclase perfecto.

+0

También debe anular 'initWithObjects: forKeys: count:' –

4

Aquí tienes tu problema. NSDictionary (y su contraparte mutable) es parte de un clúster de clase (lea más sobre ellos here, bajo el encabezado 'Class Cluster') y no se debe subclasificar porque causa problemas como los que ha mencionado (lea las notas de subclases en el NSDictionary Class Reference). Sea lo que sea lo que necesite hacer, tendrá una forma de extender las clases que desea usar para hacer lo que desea hacer. Por ejemplo, el código anterior puede ubicarse fácilmente en una categoría (lea más sobre las categorías here).

+0

Gracias por el aviso. Parece que para subclasificar un Clúster de Clase solo necesito implementar todos los métodos primitivos. Para NSMutableDictionary esto significa que también necesito escribir una aplicación sencilla para contar * * objectForKey: * * keyEnumerator setObject: forKey: * removeObjectForKey: estoy reticentes a utilizar una categoría porque según entiendo que lo haría ¿afecta cada uso de NSMutableDictionary dentro de mi aplicación? – Ben

+0

Además, no sé lo que está haciendo mal, pero cuando intenta acceder a una clave que no se encuentra en un diccionario, devuelve 'nil' de todos modos; no arroja una 'NSUndefinedKeyException' ... ¿Qué es exactamente lo que estás tratando de hacer? –

+0

Gracias. Probablemente debería haberlo intentado en vez de buscarlo en la documentación. – Ben

-1

¿Está seguro de que no recibirá la excepción al pasar "nil" por una LLAVE (no es un valor)?