2009-04-13 15 views
7

Tengo un método setter (setMinimumNumberOfSides) que deseo sobrescribir después de usar sintetizar. En él, estoy poniendo una restricción en la variable de instancia para asegurarme de que int está dentro de ciertos límites.Reemplazando un método setter, y obteniendo información

Más tarde en un método init personalizado, estoy estableciendo otra variable de instancia (numberOfSides), pero necesito asegurarme de que minimumNumberOfSides y maximumNumberOfSides se establecieron correctamente dentro de los límites. Traté de cambiar el valor de retorno en el colocador a un BOOL, por lo que podría devolver un SÍ o NO si tuvo éxito/error, pero eso creó un método contradictorio, supongo que porque estoy usando sintetizar y anular el colocador.

¿Cómo puedo obtener la información fácilmente para verificar si se llamó al proveedor y se devolvió con éxito?

-(void)setNumberOfSides:(int)sides 
{ 
    if ((sides < maximumNumberOfSides) && (sides > minimumNumberOfSides)) 
    { 
     numberOfSides = sides; 
    } 
    else 
     NSLog (@"Invalid number of sides: %d is outside the constraints allowed", sides); 


} 

-(void)setMinimumNumberOfSides:(int)minimum 
{ 
    if (minimum > 2) 
     minimumNumberOfSides = minimum; 

} 

-(void)setMaximumNumberOfSides:(int)maximum 
{ 
    if (maximum <= 12) 
     maximumNumberOfSides = maximum; 

} 

-(id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max 
{ 
    if (self = [super init]) 
    { 
     self.minimumNumberOfSides = min; 
     self.maximumNumberOfSides = max; 

     self.numberOfSides = sides; 
    } 
    return self; 
} 

Respuesta

7

No tiene que sintetizar numberOfSides si planea implementar getter y setter. Sin @synthesize numberOfSides puede devolver un BOOL si lo desea. Deberá declarar el getter/setter en su interfaz en consecuencia.

Por cierto, otro enfoque sería usar el captador/colocador sintetizado y agregar un método diferente -(BOOL)isNumberOfSidesValid que realiza esta comprobación.

+0

Dale un golpe. +1 –

3

En una situación como esta, es mejor que utilices una simple llamada al assert(), o hagas una excepción.

La elección dependerá de cómo vea usar esta clase. Si formará parte de una biblioteca y espera que otros desarrolladores suministren con frecuencia valores incorrectos para minimumNumberOfSides o maximumNumberOfSides, probablemente debería lanzar una excepción adecuada.

Una palabra de advertencia, sin embargo. Si espera que los usuarios de de su aplicación suministren con frecuencia valores incorrectos, entonces una excepción es una mala idea. El manejo de excepciones en Objective-C es una operación costosa. Si estas verificaciones están en su lugar por el bien del usuario, debe realizar la validación de la entrada e informar los errores al usuario de una manera mucho más amigable.

edición: Aquí algunos ejemplos de código rápida:

-(void)setMinimumNumberOfSides:(int)minimum 
{ 
    if (minimum <= 2) 
    { 
     [NSException raise:@"invalid minimumNumberOfSides value" 
        format:@"value of %d is too low (must be > 2)", minimum]; 
    } 

    minimumNumberOfSides = minimum; 
} 

edición: Aquí es another SO question que entra en detalles sobre el manejo de excepciones en Objective-C.

Cuestiones relacionadas